jsf - valor - no se ha podido reconocer como fecha primefaces
El valor del error de validación no es válido (1)
La forma en que especificó el itemValue
de <f:selectItems>
e implementado el getAsString()
del convertidor no es correcto.
Cuando se envía el valor seleccionado, JSF convertirá cityID
en City
mediante getAsObject()
del convertidor. Entonces, JSF validará la City
contra el itemValue
de <f:selectItems>
para ver si realmente es parte de la lista (esto es para evitar hackers que modifique / altere las solicitudes con un valor diferente). Sin embargo, dado que itemValue
es cityID
que es un Integer
la comparación falla para cada elemento de la lista. De ahí el Value not valid
error Value not valid
.
Necesita cambiar itemValue
para que sea City
lugar y cambie getAsString()
para devolver el cityID
:
<p:selectOneMenu id="city" value="#{kkmBean.client.address.city}" style="width: 263px;"
converter="cityConveter" required="true" requiredMessage="You must choose one city">
<f:selectItems value="#{kkmBean.cityList}" var="city" itemLabel="#{city.cityName}" itemValue="#{city}"/>
</p:selectOneMenu>
y
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
City city = (City) value;
return city.getCityID() != null ? String.valueOf(city.getCityID()) : null;
}
Resumido: el tipo de itemValue
debe ser exactamente el mismo que el tipo del value
desplegable y el convertidor debe convertir exactamente entre ese tipo y cadena.
Ver también:
Esta pregunta ya tiene una respuesta aquí:
- Error de validación: el valor no es válido 2 respuestas
Sé que este es un error común, y que hay muchas preguntas al respecto, pero debo crear uno nuevo.
Aquí está mi página jsf:
<h:form id="clientCreatingForm">
<p:selectOneMenu id="city" value="#{kkmBean.client.address.city}" style="width: 263px;"
converter="cityConveter" required="true" requiredMessage="You must choose one city">
<f:selectItems value="#{kkmBean.cityList}" var="city" itemLabel="#{city.cityName}" itemValue="#{city.cityID}"/>
</p:selectOneMenu>
<p:commandButton value="Save client" type="button" onclick="confirm.show()" style="margin-top: 20px; margin-left: 30px; width: 180px;" />
<p:commandButton value="Reset fields" type="reset" style="margin-top: 20px; margin-left: 30px; width: 180px;"/>
<p:confirmDialog message="Are you sure, you want to save client?"
header="Save client" severity="info" widgetVar="confirm">
<p:commandButton value="Yes, I am sure." oncomplete="confirm.hide()"
action="#{kkmBean.saveClient}" update=":warnings" style="font-size: 12px;"/>
<p:commandButton value="No, I don''t!" onclick="confirm.hide()" type="button" style="font-size: 12px;"/>
</p:confirmDialog>
</h:form>
Aquí está el frijol administrado:
@ManagedBean(name = "kkmBean")
@SessionScoped
public class CreatingClientManager implements Serializable {
/** Creates a new instance of CreatingClientManager */
public KreiranjeKorisnikaManager() {
client= new Client();
client.setAddress(new Address());
cityList = new LinkedList<City>();
cityList = Communication.getInstance().getCitySessionBeanRemote().getCities();
}
private Client client;
private List<City> cityList;
public String startCreatingClent() {
return "creating-client";
}
/**
* @return the client
*/
public Klijent getClient() {
return client;
}
/**
* @param client the client to set
*/
public void setClient(Client client) {
this.Client = client;
}
/**
* @return the cityList
*/
public List<Grad> getCityList() {
return cityList;
}
/**
* @param cityList the cityList to set
*/
public void setCityList(List<City> cityList) {
this.cityList = cityList;
}
public String saveClient() {
System.out.println("i am in saveClient method");
String message = Communication.getInstance().getClientSessionBeanRemote.saveClient(client);
FacesContext context = FacesContext.getCurrentInstance();
kontekst.addMessage(message, new FacesMessage(FacesMessage.SEVERITY_INFO, "Success: ", message));
return null;
}
}
Y finalmente convertidor:
@FacesConverter(forClass=City.class, value="cityConverter")
public class CityConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Integer cityID = Integer.valueOf(value);
CreatingClientManager kkm = (CreatingClientManager) ((HttpSession)context.getExternalContext().getSession(true)).getAttribute("kkmBean");
List<Grad> cityList = kkm.getCityList();
for (int i = 0; i < cityList.size(); i++) {
City city = cityList.get(i);
if(city.getCityID().equals(cityID)) {
System.out.println(city.getCityName());
return city;
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return value.toString();
}
}
Por supuesto, el problema está en selectOneMenu. Cuando envío el formulario, recibí este molesto error.
Estaba depurando el convertidor y la línea antes de graduarme de regreso, imprimo grad.getImeGrada () y todo está bien, se imprime el nombre (Ime) de la ciudad encontrada (grad). ¿Me estoy perdiendo de algo?
ps Lo siento en mi inglés, espero que entiendas cuál es mi problema.
Casi olvidé mencionar que anulo los métodos equals y hashCode, y estoy seguro de que está bien.