为什么JSF找不到我的验证方法?

时间:2013-08-27 12:15:18

标签: validation jsf composite-component

我有这个简单的复合组件:

    <!-- INTERFACE -->
<cc:interface>
    <cc:attribute name="username" required="true" type="java.lang.String"/>
    <cc:attribute name="password" required="true" type="java.lang.String"/>
    <cc:editableValueHolder name="input" targets="username password"/>
    <cc:attribute name="validator" method-signature=
                  "void Action(javax.faces.context.FacesContext, 
                  javax.faces.component.UIComponent,Object)"
                  required="true"/>
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>
    <h:panelGrid columns="3" styleClass="components" cellpadding="5px">
        <h:outputText value="#{msg['login.username']}"/>
        <h:inputText id="username" value="#{cc.attrs.username}" required="true"/>
        <h:message styleClass="error" for="username"/>
        <h:outputText value="#{msg['login.password']}"/>
        <h:inputSecret id="password" value="#{cc.attrs.password}" 
                       validator="#{cc.attrs.validator}" required="true"/>
        <h:message styleClass="error" for="password"/>
        <h:commandButton value="#{msg['login.confirm']}"/>
    </h:panelGrid>
</cc:implementation>

我这样使用它(当然都在h:form标签内):

<imp:loginComponent username="#{databaseManager.username}" 
                            password="#{databaseManager.password}"
                            validator="#{databaseManager.validator}" >
        </imp:loginComponent>

在这里,您可以看到我的验证方法:

 public void validator(FacesContext context, UIComponent component, Object value)
        throws ValidatorException {
    // ziskani username a password komponent
    UIInput passwordComponent = (UIInput) component;
    UIInput usernameComponent = ((UIInput) component.findComponent("username"));
    // az do teto chvile byl vstup validni?
    if (usernameComponent.isValid() && passwordComponent.isValid()) {
        // validace proti DB
        String username = usernameComponent.getValue().toString();
        String password = value.toString();
        if (!userRecordFacade.authorizedAcces(username, password)) {
            System.out.println("blbe");
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid", null);
            throw new ValidatorException(message);
        }
    }
}

一切正常,直到我通过ValidatorException。 h:消息通过密码输入没有异常但是有一些奇怪的消息:/login.xhtml @ 16,75 validator =“#{databaseManager.validator}”:类'com.dusek.DatabaseManager'没有属性'验证器”。

怎么可能?如果该方法没有抛出ValidatorException,那就很好。但这是非常不好的行为,我的意思是: - )。

你可以告诉我一些建议吗?感谢。

1 个答案:

答案 0 :(得分:-1)

我认为这是10000 ....复合组件的错误之一。我认为在实现getter getValidator时它已经解决了。它不会被使用,但由于某些原因,JSF想要它。

此外,为什么还要一个如此动态的可重用登录组件?您的应用程序有多少种不同的登录版本?我认为你根本不应该在这里使用复合组件。