0

簡単なユーザー作成ページを作成しようとしています。ユーザーが目的のユーザー名を入力できるようにしたいのですが、ユーザー名が既に使用されている場合は、出力テキストが表示され、「ユーザー名は既に使用されています」と表示されます。

ここに私のxhtmlページがあります

<tr>
                        <td>Username: </td>
                        <td>
                        <p:inputText id="username" value="#{createUserManagedBean.username}" required="true" requiredMessage="Username is required.">
                            <p:ajax event="keyup" update="uniqueUsernameMessage"/>
                        </p:inputText>                          
                        </td>
                        <td>
                            <h:outputText id="uniqueUsernameMessage" value="Username already in use" rendered="#{!createUserManagedBean.checkUniqueUsername()}" />
                        </td>
                    </tr>

これが私のマネージドBeanです

public boolean checkUniqueUsername()
{
    if(!StringUtils.isBlank(getUsername()))
    {
        UserDTO userDTO = new UserDTO();
        userDTO.setUsername(username);
        boolean result = getUserService().validateUniqueUsername(userDTO);
        return result;
    }
    else
        return false;
}

私の問題は、キーアップ イベントごとにメッセージが更新されないことです。サービスが呼び出されましたが、メソッドの結果に応じて要素が表示されるかどうかが変化しませんでした。

4

1 に答える 1

2

属性を使用するrenderedことは、入力コンポーネントを検証する正しい方法ではありません。Validator実際の実装を使用する必要があります。そこでは、無効化の場合に を でスローすることができValidatorExceptionますFacesMessage。次に、JSF は、入力コンポーネントに関連付けられFacesMessageた右側に配置されるようにします。<h:message>

全体として、これは次のようにする必要があります。

<p:inputText id="username" value="#{createUserManagedBean.username}" ...>
    <f:validator binding="#{uniqueUsernameValidator}" />
    <p:ajax event="keyup" update="usernameMessage" />
</p:inputText>
<h:message id="usernameMessage" for="username" />

@ManagedBean
@RequestScoped
public class UniqueUsernameValidator implements Validator {

    @EJB
    private UserService userService;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (value == null || value.isEmpty()) {
            return; // Let required="true" handle.
        }

        String username = (String) value;

        if (userService.findByUsername(username) != null) {
            throw new ValidatorException(new FacesMessage(
                FacesMessage.SEVERITY_ERROR, "Username already in use. Please choose another", null));
        }
    }

}

以下も参照してください。


@ManagedBeanバリデータは aではなく a である@FacesValidatorことに注意してください@EJB。しかし、EJB を使用しておらず、手動でサービス クラスを作成し、自分でトランザクションをいじっている場合は、おそらくそれを実際のままにしておくことができます@FacesValidator

@FacesValidator("uniqueUsernameValidator")
public class UniqueUsernameValidator implements Validator {

代わりに、次のように参照されます。

<f:validator validatorId="uniqueUsernameValidator" />

以下も参照してください。

于 2013-09-05T11:32:20.637 に答える