すでに述べたように、Primefaces Captcha コンポーネントは ajax リクエストでは更新できません。しかし、簡単な解決策があります - Captcha コンポーネント自体ではなく、すべてを更新します。
あなたの XHTML:
<h:form id="myForm">
<h:panelGroup id="updateFormAllValuesButNotCaptcha">
Name: <p:inputText id="name" value="#{captchaBean.name}" required="true"/>
<br/>
Comment: <p:inputTextarea id="comment" value="#{captchaBean.comment}" required="true"/>
<br/>
</h:panelGroup>
<p:captcha/>
<p:commandButton value="click me" update="updateFormAllValuesButNotCaptcha"
actionListener="#{captchaBean.someAction}" oncomplete="Recaptcha.reload()"
onerror="Recaptcha.reload()"/>
</h:form>
<p:messages globalOnly="false" autoUpdate="true"/>
バッキング Bean:
@ManagedBean
@ViewScoped
public class CaptchaBean implements Serializable {
private String name;
private String comment;
public String getComment() { return comment; }
public void setComment(String comment) { this.comment = comment; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public void someAction() {
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Done", "");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
updateFormAllValuesButNotCaptcha
すべてのフォーム入力フィールドを含むが Captcha 自体を含まないパネルを更新していることに注意してください。また、Captcha は再利用できないことに注意することも重要です。そのため、ajax リクエストが完了またはエラーで終了した場合は、常に Captcha をリロードする必要があります。
commandButton のアクションが成功した後に何を更新するかは、あなた次第です。フォームを非表示にして (レンダリングしないで)、確認メッセージのみを表示して、ユーザーが再度コメントを送信しないようにすることができます。