Валидатор inputText не отображает сообщение об ошибке - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть простая форма, которая получает код, затем отображает его клевету, я добавил компонент-валидатор, который проверяет, существует ли код.Моя проблема в том, что я не могу отобразить сообщение об ошибке, когда код не существует.

Вот код:

test.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
<h:head><title>Test</title>
</h:head>
<body class="bodyMain">

<h:form>        
    <h:panelGrid columns="3">
        <h:outputText value="Code: " />
        <h:inputText id="code" value="#{myBean.code}"
            validator="#{myBean.validateCode}">
            <f:ajax execute="@this" render="libelle" listener="#{myBean.setLibelle()}"/>
        </h:inputText>
        <h:message for="code" style="color:red"/>
    </h:panelGrid>
    <h:panelGrid id="libelle" columns="2">
        <h:outputText value="Libelle: " />
        <h:outputText value="#{myBean.libelle}" />
    </h:panelGrid>
</h:form>       

</body>
</html>

MyBean.java

@ManagedBean
@ViewScoped
public class MyBean implements java.io.Serializable{
    private static final long serialVersionUID = 1L;

    private String code="";
    private String libelle="";

    public String getCode() {
        return this.code;
    }

    public void setCode(String code) {
        this.code=code;
    }       

    public String getLibelle() {
        return this.libelle;
    }

    public void setLibelle(String libelle) {
        this.libelle=libelle;
    }

    public void setLibelle() {
        if (code.compareTo("1")==0)
            libelle="One";
        else
            libelle="";
    }

    public void validateCode(FacesContext context, UIComponent toValidate, Object value) throws ValidatorException {
        String code = (String)value;
        if (code.compareTo("1") != 0) {
            FacesMessage message = new FacesMessage("Code doesn't exist");
            throw new ValidatorException(message);
        }
    }

}

Спасибо за помощь в решении этой проблемы

1 Ответ

4 голосов
/ 20 февраля 2012

Вы не обновляете компонент <h:message> с помощью <f:ajax>. Вам нужно дать <h:message> id и включить его в <f:ajax render>.

<h:inputText id="code" value="#{myBean.code}" validator="#{myBean.validateCode}">
    <f:ajax execute="@this" render="libelle codeMessage" listener="#{myBean.setLibelle()}"/>
</h:inputText>
<h:message id="codeMessage" for="code" style="color:red"/>

Не связано с конкретной проблемой, не инициализируйте свойства для пустых строк. Пусть их по умолчанию null. Также сравнение объектов должно выполняться методом equals(), а не compareTo(). Наконец, использование раскрывающегося списка со всеми доступными значениями вместо поля ввода будет более удобным для пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...