Tengo un problema con una p:selectOneMenu, no importa lo que haga no puedo conseguir JSF para llamar a la incubadora en la entidad JPA. JSF se produce un error de validación con este mensaje:

forma:ubicación: Error de Validación: Valor no es válido

Tengo esta trabajando en varias de las otras clases del mismo tipo (es decir, de unirse a la mesa de las clases), pero no para la vida de mí obtener este trabajo.

Si alguien puede arrojar algo de solución de problemas/sugerencias de depuración para este tipo de problema sería muy apreciado.

El uso de declaraciones de registro que he comprobado lo siguiente:

  1. La Conveter está volviendo correcta, no null valores.
  2. No tengo Bean Validation en mi entidades JPA.
  3. El setter setLocation(Location location) nunca es llamado.

Este es el ejemplo más simple que puedo hacer y que simplemente no va a funcionar:

<h:body>
    <h:form id="form">
        <p:messages id="messages" autoUpdate="true" />
        <p:selectOneMenu id="location" value="#{locationStockList.selected.location}" converter="locationConverter">
            <p:ajax event="change" update=":form:lblLocation"/>
            <f:selectItems value="#{locationStockList.locationSelection}"/>
        </p:selectOneMenu>
    </h:form>
</h:body>

Convertidor:

@FacesConverter(forClass=Location.class, value="locationConverter")
public class LocationConverter implements Converter, Serializable {
    private static final Logger logger = Logger.getLogger(LocationConverter.class.getName());

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value.isEmpty())
            return null;
        try {
            Long id = Long.parseLong(value);
            Location location = ((LocationManagedBean) context.getApplication().getELResolver().getValue(context.getELContext(), null, "location")).find(id);
            logger.log(Level.SEVERE, "Converted {0} to {1}" , new Object[] {value, location});
            return location;
        } catch (NumberFormatException e) {
            return new Location();
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value == null || value.toString().isEmpty() || !(value instanceof Location))
            return "";
        return String.valueOf(((Location) value).getId());
    }    
}

Salida de la consola:

//Getter method
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0] 
//Session Bean
INFO: Finding ejb.locations.Location with id=3 
//Session Bean
INFO: ### Returning : ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3] 
//Converter
SEVERE: Converted 3 to ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3] 
//Getter method -> Where did my selected Location go ??
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0] 

OriginalEl autor klonq | 2012-01-30

3 Comentarios

  1. 126

    Validación falla con el mensaje de «forma:ubicación: Error de Validación: Valor no es válido»

    Este error se reduce a que el elemento seleccionado no coincide con ninguna de las disponibles, seleccione los valores de elemento especificado por el anidada <f:selectItem(s)> etiqueta durante el procesamiento de la forma de envío de solicitud.

    Como parte de salvaguardia contra alterado/hackeado solicitudes, JSF, se reitera sobre todos los disponibles, seleccione los valores de elemento de prueba y si selectedItem.equals(availableItem) devuelve true para al menos uno de los elementos disponibles de valor. Si no hay un elemento de valor coincide, entonces usted recibirá exactamente este error de validación.

    Este proceso está bajo la cubre básicamente de la siguiente, la cual bean.getAvailableItems() fictionally representa la totalidad de la lista de disponibles, seleccione los elementos definidos por <f:selectItem(s)>:

    String submittedValue = request.getParameter(component.getClientId());
    Converter converter = component.getConverter();
    Object selectedItem = (converter != null) ? converter.getAsObject(context, component, submittedValue) : submittedValue;
    
    boolean valid = false;
    
    for (Object availableItem : bean.getAvailableItems()) {
        if (selectedItem.equals(availableItem)) {
            valid = true;
            break;
        }
    }
    
    if (!valid) {
        throw new ValidatorException("Validation Error: Value is not valid");
    }

    Así, sobre la base de la lógica anterior, este problema puede lógicamente tienen al menos una de las siguientes causas:

    1. El elemento seleccionado no se encuentra en la lista de elementos disponibles.
    2. La equals() método de la clase que representa el elemento seleccionado es falta o está rota.
    3. Si una costumbre Converter, entonces se ha vuelto el objeto incorrecto en getAsObject(). Tal vez es aún null.

    A resolver es:

    1. Asegurarse de que exactamente la misma lista se ha conservado durante la posterior solicitud, sobre todo en el caso de múltiples menús en cascada. Hacer el frijol @ViewScoped en lugar de @RequestScoped debería solucionar el problema en la mayoría de los casos. También asegúrese de que usted no realizar la lógica de negocio en el método getter de <f:selectItem(s)>, sino en @PostConstruct o un evento de la acción (el que escucha) método. Si usted está confiando en la solicitud específica de parámetros, entonces se tendría que guardar explícitamente en el @ViewScoped bean, o para volver a pasar por ellos en las solicitudes posteriores, por ejemplo en <f:param>. Véase también Cómo elegir el derecho de frijol alcance?
    2. Asegurarse de que el equals() método es aplicado a la derecha. Esto ya está hecho a la derecha en el estándar de tipos de Java, tales como java.lang.String, java.lang.Number, etc, pero no necesariamente en objetos personalizados/frijoles/entites. Véase también Forma correcta de implementar equivale contrato. En caso de que usted ya está usando String, asegúrese de que la solicitud de codificación de caracteres está configurado derecho. Si contiene caracteres especiales y JSF está configurado para representar la salida como UTF-8, pero interpretar la entrada como por ejemplo, ISO-8859-1, entonces se producirá un error. Ver también.o. La entrada de Unicode recuperado a través de PrimeFaces de entrada de componentes dañados.
    3. Depuración y registro de las acciones de su costumbre Converter y lo corrijan. Para obtener instrucciones, consulte también Error de conversión de los valores de ajuste para ‘null Converter’ En caso de que usted está usando java.util.Date como elementos disponibles con <f:convertDateTime>, asegúrese de que usted no se olvide el tiempo completo de parte del patrón. Véase también «Error de validación: Valor no es válido» error de f:datetimeConverter.

    Véase también:


    Si alguien puede arrojar algo de solución de problemas/sugerencias de depuración para este tipo de problema sería muy apreciado.

    Hacer una clara y concreta la pregunta aquí. No pido demasiado amplio preguntas 😉

    Brillante, el método equals había ido por mal camino
    Dónde está exactamente en la mojarra código, que este equals de verificación suceder. Mi situación es un poco compleja. Puedo crear mi propio componente personalizado que permiten al usuario tener complejos de radio de diseño. Funciona bien si sólo tengo uno radio group (f:selectItems a la derecha debajo de mi componente personalizado). Sin embargo, como el diseño de obtener más complejas (varias de radio del grupo, cada uno tiene su propia f:selectItems pero todos comparten la misma selección), tengo que tener f:selectItems dentro de la ui:repeat, la interfaz de usuario:la repetición es bajo mi componente personalizado. Entonces me encontré con este problema. Quiero ver la mojarra código que manejan este
    También mi f:selectItems es de tipo Cadena, así que estoy seguro de que esto no es un problema de la conversión, creo que esta es la causa porque la lista de f:selectItems no está allí durante la fase de validación.
    Usted puede elaborar sobre cómo usar f:param para enviar el estado del bean gestionado de modo que puede volver a crear el «estado inicial»??? Gracias.
    De haber un error similar. Estoy usando el SelectItemsConverter y este componente está dentro de una movilidad fieldset – así es desactivados. Es un conocido comportamiento?

    OriginalEl autor BalusC

  2. 2

    En mi caso me olvidé de implementar una correcta métodos get/set. Sucedió porque he cambiado un montón de atributos a lo largo del desarrollo.

    Sin un adecuado método get, JSF cant recuperar el elemento seleccionado, y pasa lo que BalusC dijo en el punto 1 de su respuesta:

    1 . El elemento seleccionado se encuentra en la lista de elementos disponibles. Esto puede suceder si la lista de elementos disponibles es servido por un ámbito de petición bean, el cual no está correctamente reinicializado en la solicitud posterior, o está incorrectamente haciendo el negocio del trabajo en el interior de un método getter que hace que se genere una lista diferente de alguna manera.

    OriginalEl autor Henrique Liberato

  3. 0

    Esto puede ser un Convertidor de Problema o de lo contrario DTO problema.
    Tratar de resolver esto, mediante la adición de hashCode() y equals() métodos en el objeto de DTO; En el escenario anterior puede generar estos métodos dentro de la Ubicación de clase de objeto que indican como el » DTO » aquí.

    Ejemplo:

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (id ^ (id >>> 32));
        return result;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Location other = (Location) obj;
        if (id != other.id)
            return false;
        return true;
    }
    • Por favor, tenga en cuenta que el ejemplo anterior es para un ‘id’ de tipo ‘largo’.
    Como se dijo en el #2 en la aceptó y altamente upvoted respuesta
    ¿Por qué estás repitiendo un dado ya la respuesta?

    OriginalEl autor Rizla Shareefdeen

Dejar respuesta

Please enter your comment!
Please enter your name here