válido valor validación validaciones mensajes formularios error java jsf jboss jboss6.x mojarra

java - valor - mensajes en jsf



Error de validación de JSF: el valor no es válido (3)

Esta pregunta ya tiene una respuesta aquí:

Sé que esto parece ser común, pero estoy perdido con eso. Ocurre al hacer clic en el botón Agregar en assessment.jsf. De todos modos, adjunté lo que creo que son las secciones relevantes.

FWIW, AssessmentType.equals () no se desencadena cuando depuro.

Gracias por adelantado.

j_idt38:j_idt47:j_idt48: Validation Error: Value is not valid

assessment.xhtml:

<h:form> <h:selectOneMenu value="#{assessmentBean.assessmentField}"> <f:selectItems value="#{assessmentBean.assessment.type.fields}" /> </h:selectOneMenu> <h:commandButton value="Add" action="#{assessmentBean.doAddField}"> <f:param name="assessmentId" value="#{assessmentBean.assessment.id}" /> </h:commandButton> </h:form>

assessment.jsf:

<form id="j_idt38:j_idt47" name="j_idt38:j_idt47" method="post" action="/jsf-web/edit/assessment.jsf" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="j_idt38:j_idt47" value="j_idt38:j_idt47" /> <select name="j_idt38:j_idt47:j_idt48" size="1"> <option value="1">Presenting Condition</option> <option value="2">Problem Duration</option> </select> <script type="text/javascript" src="/jsf-web/javax.faces.resource/jsf.js.jsf?ln=javax.faces"></script> <input type="submit" name="j_idt38:j_idt47:j_idt50" value="Add" onclick="mojarra.jsfcljs(document.getElementById(''j_idt38:j_idt47''),{''j_idt38:j_idt47:j_idt50'':''j_idt38:j_idt47:j_idt50'',''assessmentId'':''1''},'''');return false" /><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="3431661972220941645:6952134510589038883" autocomplete="off" /> </form>

AssessmentType.java:

import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.validation.constraints.NotNull; import lombok.Data; import org.hibernate.envers.Audited; @Audited @Data @Entity public class AssessmentType implements Comparable<AssessmentType> { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull private String name; @OneToMany( fetch=FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity=AssessmentField.class ) private List<AssessmentField> fields; @Override public int compareTo(final AssessmentType o) { return getId().compareTo(o.getId()); } @Override public String toString() { return getName(); } }

AssessmentFieldConverter.java

import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.FacesConverter; import javax.naming.InitialContext; import javax.naming.NamingException; import com.htu.fizio.api.AssessmentFieldManager; import com.htu.fizio.domain.AssessmentField; @FacesConverter(forClass = AssessmentField.class) public class AssessmentFieldConverter implements Converter { AssessmentFieldManager<AssessmentField> assessmentFieldManager; @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Object getAsObject(FacesContext ctx, UIComponent component, String value) { try { final InitialContext ic = new InitialContext(); assessmentFieldManager = (AssessmentFieldManager) ic.lookup("fizio/AssessmentFieldManagerImpl/local"); return assessmentFieldManager.find(Long.valueOf(value)); } catch (NamingException e) { e.printStackTrace(); } return null; } @Override public String getAsString(FacesContext ctx, UIComponent component, Object value) { return String.valueOf(((AssessmentField) value).getId()); } }

AssessmentBean.java

import java.util.List; import javax.annotation.PostConstruct; import javax.ejb.EJB; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.SessionScoped; import lombok.Getter; import lombok.Setter; import com.htu.fizio.api.AssessmentManager; import com.htu.fizio.domain.Assessment; import com.htu.fizio.domain.AssessmentField; import com.htu.fizio.domain.AssessmentFieldValue; import com.htu.fizio.jsf.faces.FacesUtil; ... @PostConstruct public void init() { if (FacesUtil.containsKey("assessmentId")) { final Long id = Long.parseLong(FacesUtil.get("assessmentId")); assessment = assessmentManager.find(id); } else { assessment = new Assessment(); } } public String doAddField() { final AssessmentFieldValue value = new AssessmentFieldValue(); value.setField(assessmentField); value.setValue(""); assessment.getFieldValues().add(value); assessmentManager.save(assessment); return "/edit/assessment"; }

Editar:

Recién noté que cuando se depura, ¿es probable que sea sospechoso ?:

Daemon Thread [HandshakeCompletedNotify-Thread] (Suspended (exception ConcurrentModificationException)) HashMap$EntryIterator(HashMap$HashIterator<E>).nextEntry() line: 793 HashMap$EntryIterator.next() line: 834 HashMap$EntryIterator.next() line: 832 SSLSocketImpl$NotifyHandshakeThread.run() line: 2214


La validación está fallando porque después de que su convertidor convierte la representación de String de AssessmentType a un objeto, JSF itera sobre los valores existentes ( assessmentBean.assessment.type.fields ) y compara este objeto recientemente convertido con todos los existentes.

Como no implementó Object#equals para AssessmentType, se establecerá de manera predeterminada una comparación de identidad de objeto (más o menos verbalmente, la dirección de memoria de su objeto), que por supuesto fallará.

La solución es, por lo tanto, implementar Object#equals , o dejar que el convertidor obtenga el objeto de assessmentBean.assessment.type.fields lugar de AssessmentTypeManager .


Error de validación: el valor no es válido

Hasta el punto, este error significa que el elemento seleccionado no coincide con ninguno de los elementos disponibles en la lista. Es decir, el objeto representado por el valor del elemento seleccionado nunca ha devuelto true en su llamada equals() con ninguno de los elementos seleccionados disponibles.

Solo hay dos causas para este problema:

  1. El método equals() del tipo de objeto en cuestión está roto.
  2. El contenido de la lista de elementos es diferente durante la fase de validación de la solicitud de envío del formulario que durante la fase de respuesta al procesamiento de la solicitud inicial para mostrar el formulario.

Dado que el primero parece estar correctamente implementado, según los comentarios, la única causa que queda es la segunda. Asumiendo que no estás haciendo lógica de negocios en un método getter, una prueba fácil es poner el #{assessmentBean} en el alcance de la sesión. Si funciona, entonces la lógica de carga de datos (pre) de la lista de elementos seleccionados es definitivamente incorrecta.


Creo que he resuelto esto, al menos, pasé al siguiente error.

A pesar de publicar resmas de código, no había publicado el xhtml completo en el que había varias etiquetas de formulario anidadas. Solo una forma parece permitir pasar el parámetro assessmentId, que a su vez permite que la AssessmentBean complete la Lista de campos de evaluación para el tipo de evaluación correctamente.

Gracias por toda la ayuda.