指定するaddMessage()クライアントIDは、コンポーネントIDではなく、実際のクライアントIDである必要があります。入力コンポーネントのクライアントIDには、通常、親フォームコンポーネントのIDが接頭辞として付けられます。どのJSFコンポーネントが実装され、クライアントIDがどのように生成されるかを覚えていない初心者にとってNamingContainer、実際のクライアントIDを見つける最も簡単な方法は、ブラウザーでページを開き、そのソースを表示して、生成されたHTML<input type="text">要素を見つけ、最後にそのを取得することidです。<h:form>のIDを指定した場合はformId、になりますformId:email。これは、で指定する必要がある実際のクライアントIDですaddMessage()。
context.addMessage("formId:email", message);
適切なクライアントIDを指定しない場合、メッセージは未処理のままになります。JSFプロジェクトステージがに設定されている場合、JSFはDevelopmentそれを本文の最後にある「未処理のメッセージ」のリストに自動的に追加します。これはあなたが見ているものです。生成されたHTMLソースを表示して、自分で確認します。これは、自動生成されたHTMLリスト<ul id="javax_faces_developmentstage_messages">です。
具体的な問題とは関係なく、 JSFBeanアクションメソッドで検証を行っているようです。これは正しい方法ではありません。これにはを使用する必要がありますValidator。これにより、クライアントIDについて心配する必要がなくなります。をスローする必要がありValidatorExceptionますFacesMessage。例えば
@FacesValidator("uniqueEmailValidator")
public class UniqueEmailValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
// ...
if (emailIsAlreadyInUse) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email is already in use", null));
}
}
}
<f:validator validatorId="uniqueEmailValidator" />次に、入力コンポーネント内として登録します。