Error de validación: el valor no es válido cuando se usa un convertidor personalizado [duplicado]

NetBeans 7.1.1 JSF2.1

Cuando se usa el atributo converter="convK" en h:selectManyCheckBox, todo funciona bien. Pero traté de usar el formulario @FacesConverter(forClass=className.class) y sigue dándome errores de "La validación no es válida". Intenté cambiarlo a forClass=packageName.className.class pero no hubo ayuda.

Este es el convertidor:

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
 @FacesConverter( "convK")
  public class KorisnikConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
     if (value==null) return value;
     if (value.isEmpty()) return value;
        for (int i=0; i<Arhiva.getSviKor().size(); i++) {
            if (Arhiva.getSviKor().get(i).getUsername().equals(value)) {
                return Arhiva.getSviKor().get(i);
            }
        }
     return value;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value==null) return "";
    if (value instanceof Korisnik) return ((Korisnik)value).getUsername();
    return "";
}   
}

Tengo una clase llamada Korisnik que tiene un par de campos de texto, el nombre de usuario es único. En mi bean de administración principal, tengo un par de arrayList de esos objetos. El objetivo es usar selectManyCheckBox para elegir solo algunos de los usuarios y colocarlos en una lista de matriz separada para otros usos. Quería empujar objetos completos (siempre puedo trabajar fácilmente con cadenas y crear y administrar objetos en mis beans de control, pero quería probar convertidores personalizados para que selectItems trabajara con objetos)

En mi clase, anulé equals y hashCode (ya que se habla mucho sobre los convertidores personalizados que dan bla, bla, bla, bla, bla, bla, bla, bla. La validación no es errores válidos).

@Override
public boolean equals (Object obj) {
    if (obj==null) return false;
    if (!(obj instanceof Korisnik)) return false;
    Korisnik k = (Korisnik)obj;
    return (this.username==k.username);
}

@Override
public int hashCode() {
    return this.username.hashCode();
}

Editar. Cuando lo uso como convertidor con nombre y uso dicho convertidor solo en esa instancia con selectManyCheckbox, funciona bien incluso sin anular equals y hashCode.

Este es el código de la casilla de verificación

  <h:selectManyCheckbox value="#{kontrolg.izabrAut}" layout="pageDirection" converter="convK" >
              <f:selectItems value="#{kontrolg.moguciAut}" var="it" itemLabel="#    {it.ime}&#160;#{it.prezime}" itemValue="#{it}"/>
      </h:selectManyCheckbox>

Lo que no sé es si no uso correctamente forClass="lo que sea" en la anotación del convertidor o si mi convertidor realmente funciona bien con ese selectManyCheckbox, pero cuando lo especifico en forma forClass se usa para todas las instancias de eso objeto y causa algún otro código que funcionó bien antes de agregar convertidores personalizados para ahora dar el error "la validación no es válida"?

preguntado el 30 de junio de 12 a las 22:06

1 Respuestas

El value is not valid se lanzará un error de validación cuando el equals() método en el elemento seleccionado tiene no devuelto true por cualquier de los artículos disponibles.

Y de hecho, su equals() el método está roto. La siguiente línea es incorrecta:

return (this.username==k.username);

Asumiré que username es un String, que es un Object. Las == compara Objects por referencia, no por su propuesta de. En otras palabras, al realizar == en dos Objects, básicamente estás probando si apuntan exactamente a la misma instancia. No está comprobando si representan el mismo valor (por ejemplo, el Object representación interna de la instancia). Deberías estar usando el Object's equals() método en cambio, el String#equals() método, aquí hay un extracto de relevancia de su javadoc:

iguales

public boolean equals(Object anObject)

Compara esta cadena con el objeto especificado. El resultado es true si y solo si el argumento no es null y es un String objeto que representa la misma secuencia de caracteres que este objeto.

El == solo es aplicable cuando se comparan primitivas como boolean, int, long, etc o cuando se prueba para null.

Entonces, para solucionar su problema, reemplace la línea incorrecta por la siguiente línea:

return username.equals(k.username);

O, cuando posiblemente puedan ser null:

return (username == null) ? (k.username == null) : username.equals(k.username);

Ver también:

contestado el 23 de mayo de 17 a las 11:05

Gracias por responder, pero todavía no funciona. Cambié check a equals (me olvidé de eso porque estaba reutilizando el código equals() que vi en las respuestas de ayuda para otras personas que preguntaban sobre el error de validación: el valor no es válido). user1493545

También intenté usar NetBeans para generar iguales y hashCode.... mismo error. Y estoy completamente desconcertado por qué funciona al 100 %, incluso sin anular los códigos de equivalencia y hash cuando especifico el convertidor por nombre como atributo de h:selectManyCheckBox. Además, se olvidó de mencionar. No recibo un error en la carga de la página, solo cuando hago clic en enviar en ese formulario de casilla de verificación. Lo cual funciona sin errores si nombro el convertidor y no uso forClass... - user1493545

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.