Ошибка проверки: недопустимое значение

У меня проблема с p: selectOneMenu, что бы я ни делал, я не могу заставить JSF вызвать установщик объекта JPA. Проверка JSF завершается с ошибкой с этим сообщением:

form: location: Validation Error: Value is not valid

Я работаю над несколькими другими классами того же типа (например, с классами таблицы соединений), но не могу на всю жизнь заставить это работать.

Если кто-нибудь может дать несколько советов по устранению неполадок / отладке для такого рода проблем, мы будем очень признательны.

Используя операторы журнала, я проверил следующее:

  1. Конвертер возвращает правильные, не нулевые значения.
  2. У меня нет Bean Validation в моих объектах JPA.
  3. Установщик setLocation (Location location) никогда не вызывается.

Это простейший пример, который я могу сделать, и он просто не будет работать:

<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>

Конвертер:

@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());
    }    
}

Вывод в консоль:

// 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] 
77
задан BalusC 16 May 2015 в 22:10
поделиться