指定する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" />
次に、入力コンポーネント内として登録します。