Вопрос по primefaces, jsf-2 – Прослушиватель Primefaces selectOneMenu не вызывается с объектами, отличными от строк [duplicate]

2

Я реализую веб-приложение, используя Jsf 2.0 и Primefaces 3.2. Я заметил это неожиданное поведение: у меня естьselectOneMenu иcommandButtonкак показано ниже

<p:selectOneMenu id="selsel" value="#{bean.myObj}">
  <f:selectItems value="#{bean.myObjList}" />
</p:selectOneMenu>
<p:commandButton id="btnid" value="Ok" actionListener="#{bean.updateSelectValues()}" />

Что происходит, еслиmyObj это неString,updateSelectValues метод не вызывается. Я вообще не вижу никаких исключений или ошибок, он просто не вызывается. Вот боб поддержки:

private List<MyObj> myObjList;
private MyObj myObj;
// getters and setters

public void updateSelectValues() {
  System.out.println(this.myObj);
}

Код для myObj:

public class MyObj implements Serializable {

  private static final long serialVersionUID = 1L;

  private String param1;
  private int param2;

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("MyObj [param1=");
    builder.append(this.param1);
    builder.append(", param2=");
    builder.append(this.param2);
    builder.append("]");
    return builder.toString();
  }

}

Ваш Ответ

1   ответ
8

что HTML и HTTP не понимают объекты Java. Все объекты Java конвертируются вString когда HTML должен быть создан JSF. Все параметры HTTP-запроса, которыеString предполагается преобразовать обратно в Java-объект, когда отправленные данные формы должны быть обработаны JSF.

Что касается вашей конкретной проблемы, если вы добавили<h:message>, <h:messages> или PrimeFaces, эквивалентный форме (а также обновив ее при отправке ajax), тогда вы должны были заметить ошибку преобразования для «нулевого конвертера». Кроме того, если вы обратили внимание на журнал сервера, вы также должны были увидеть предупреждение о необработанном сообщении.

Вам нужно создать кастомConverter который преобразует междуMyObj и его уникальныйString представление. Например:

@FacesConverter(forClass=MyObj.class)
public class MyObjConverter implements Converter {

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object valueToRender) {
        // Convert MyObj to its unique String representation.
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        // Convert String to MyObj.
    }

}

Обычно эти объекты уже хранятся в некоторой базе данных или отображаются по их идентификатору. Затем вы используете именно этот идентификатор как уникальныйString представление.

Похожие вопросы