0

Apache MyFaces ライブラリを使用してフォームを作成します。フォームは、バインディングによって jsf ページに関連付けられています。さらに、Validator-interface を実装する TestValidator-class を作成しました。フォームが表示され、入力を入力すると、検証が正常にトリガーされました。残念ながら、対応する FacesMessage を表示できません。JSFに「validator-Exceptionをスローした後、h:messagesを再レンダリングしてください」と伝えることができないと思います。

何が悪かったのか?前もって感謝します。

@FacesValidator("TestValidator") // class TestValidator
public class TestValidator implements Validator {
    @Override
    public void validate(FacesContext context, UIComponent uiComponent, Object value) throws ValidatorException {
        System.out.println("TestValidator.validate: " + value);
        if (((String) value).equals("2")){
            FacesMessage fm = new FacesMessage();
            fm.setSeverity(FacesMessage.SEVERITY_ERROR);
            fm.setSummary("TestValidator FEHLER");
            fm.setDetail("TestValidator FEHLER");
            throw new ValidatorException(fm); 
        }
    }
}

<!-- JSF-Snippet -->
<t:div id="formContainer" binding="#{formsbuilder.form}" />

private Div createFacesMessagesDiv() { // FormsBuilder-Bean-Snippet for creating the container for the FacesMessage
    facesMessagesDiv = new Div(); // CORRESPONDING BEAN PROPERTY
    facesMessagesDiv.setId("facesMessagesContainer");
    facesMessagesDiv.setStyle("color: blue; border: 3px solid green;");
    HtmlOutputText introText = new HtmlOutputText();
    introText.setId("facesMessagesIntroText");
    introText.setValue("FacesMessages - Start: ");
    facesMessagesDiv.getChildren().add(introText);
    HtmlMessages fms = new HtmlMessages();
    fms.setId("facesMessages");
    facesMessagesDiv.getChildren().add(fms);
    HtmlOutputText outroText = new HtmlOutputText();
    outroText.setId("facesMessagesOutroText");
    outroText.setValue("FacesMessages - Ende!");
    facesMessagesDiv.getChildren().add(outroText);
    return facesMessagesDiv;
}

private HtmlAjaxCommandLink createSaveFormButton() { // saveButton after hitting this button, facesMessages should show up;
    HtmlAjaxCommandLink saveFormButton = HtmlRendering.createGeneralButton("saveForm" + currentSubForm.getIdAsString(), /* ID */
    "#{resources.labels['formsgenerator_saveForm']}",
    "#{formsbuilder.submitForm}",
    null, /* action */
    null, /* actionReturnType */
    null, /* onComplete */
    "", /* styleClassValueExpression */
    "", /* imageValue */
    "modifiedContainerDiv");
    saveFormButton.setReRender(facesMessagesDiv); // CORRESPONDING BEAN PROPERTY
saveFormButton.setValueExpression("oncomplete", HtmlRendering.createValueExpression("afterGeneralSavingSubForm()");
return saveFormButton;
}
4

1 に答える 1

0

メッセージを正しく設定していないようです。

FacesMessage を FacesContext に追加するのを忘れました。

これを試して:

public void validate(FacesContext context, UIComponent uiComponent, Object value) throws ValidatorException {
    System.out.println("TestValidator.validate: " + value);
    if (((String) value).equals("2")){
        FacesMessage fm = new FacesMessage();
        fm.setSeverity(FacesMessage.SEVERITY_ERROR);
        fm.setSummary("TestValidator FEHLER");
        fm.setDetail("TestValidator FEHLER");
        FacesContext.getCurrentInstance().addMessage(null, fm);
        throw new ValidatorException(fm); 
    }
}

FacesMessage をより簡潔に記述する方法を次に示します。

public void validate(FacesContext context, UIComponent uiComponent, Object value) throws ValidatorException {
    System.out.println("TestValidator.validate: " + value);
    if (((String) value).equals("2")){
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "TestValidator FEHLER", "TestValidator FEHLER"));
        throw new ValidatorException(fm); 
    }
}
于 2013-03-27T13:38:14.913 に答える