Почему при обновлении модели произошла ошибка проверки JSF (отображается с помощью h: message)? - PullRequest
1 голос
/ 14 июня 2010

List.xhtml:

 <h:selectOneMenu value="#{produtosController.selected.codigo}">
    <f:selectItems value="#{produtosController.itemsAvailableSelectOne}"/>
 </h:selectOneMenu>
 <h:commandButton action="#{produtosController.createByCodigos}" value="Buscar" />  

Метод класса контроллера:

 public String createByCodigos(){
    items = new ListDataModel(ejbFacade.findByCodigos(current.getCodigo()));
    updateCurrentItem();
    return "List";
}  

Метод класса фасада:

 public List<Produtos> findByCodigos(Integer codigo){
    Query q = em.createNamedQuery("Produtos.findByCodigo");
    q.setParameter("codigo", codigo);
    return q.getResultList();
}

Запрос класса бина:

 @NamedQuery(name = "Produtos.findByCodigo", query = "SELECT p FROM Produtos p WHERE p.codigo = :codigo")

 @Column(name = "codigo")
 private Integer codigo;

Ответы [ 3 ]

2 голосов
/ 14 июня 2010

Из комментариев я понимаю, что это Validation Error: Value not valid.

Это означает, что выбранный в данный момент элемент не входит в список элементов выбора, как в текущем запросе.Также похоже, что значение элемента является нестандартным типом (Produtos возможно?).Существует три возможных причины этой проблемы:

  1. equals() и hashCode() типа, представляющего значение элемента, не реализованы или неправильно реализованы.Чтобы исправить это, попросите IDE автоматически сгенерировать его или прочитайте javadocs .

  2. Использовался пользовательский конвертер, и getAsObject() вернул неправильное значение.Чтобы исправить это, убедитесь, что он возвращает точно такое же значение , как оно было передано через getAsString().

  3. Компонент имеет область запроса и списокselectitems отличается от первоначального запроса, когда вы представляли форму.Чтобы это исправить, вам нужно сохранить тот же список в следующем запросе.Если вы уже используете JSF 2.0, объявление bean @ViewScoped исправит это.Если вы используете JSF 1.x, вам нужно либо поместить компонент в область действия сеанса, либо выполнить загрузку списка в конструкторе компонента.

0 голосов
/ 28 февраля 2013

Большое спасибо, balusc, у меня была такая же проблема, и я решил ее.

  1. Компонент bean находится в области запроса, и список элементов выбора не совпадает с первоначальным запросом при представлении формы. Чтобы это исправить, вам нужно сохранить тот же список в следующем запросе. Если вы уже используете JSF 2.0, объявление бина @ViewScoped исправит это.
0 голосов
/ 14 июня 2010

Вот один из них:

    public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
        if (object == null) {
            return null;
        }
        if (object instanceof Produtos) {
            Produtos o = (Produtos) object;
            return getStringKey(o.getId());
        } else {
            throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: "+ProdutosController.class.getName());
        }

Вот другой:

    public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
        if (value == null || value.length() == 0) {
            return null;
        }
        ProdutosController controller = (ProdutosController)facesContext.getApplication().getELResolver().
                getValue(facesContext.getELContext(), null, "produtosController");
        return controller.ejbFacade.find(getKey(value));
    }

Является ли это причиной потери значения: getValue (FaceContext.getELContext () null, "produtosController");?

...