0

私はいくつかのフィールドを持つBeanを持っています

@NotNull( message = "{ch.ethz.id.wai.doi.validation.doi.missingdoi}" )
@Pattern( regexp = "10\\.[\\d.]+/.*", message = "{ch.ethz.id.wai.doi.validation.doi.invalidDoi}" )
private String  doi;

@ManyToOne
@NotNull( message = "{ch.ethz.id.wai.doi.validation.doi.missingpool}" )
private DoiPool doiPool;

最初のアノテーションは、JSFで次のように期待どおりに機能します

<h:inputText
    id       = "doi"
    value    = "#{detailModel.afterObject.doi}"
/>
<h:messages for="doi" style="clear: both; color: red;"/>

他のフィールドには、参照されているオブジェクトの名前を入力する無効な入力テキストがあります。ユーザーは、ボタンをクリックして別のビューでオブジェクトを選択することにより、オブジェクトを指定できます。

<h:inputText
    id       = "doiPool"
    value    = "#{detailModel.afterObject.doiPool.name}"
    disabled = "true"
/>
<h:messages for="doiPool" style="clear: both; color: red;"/>

は参照してinputTextいませんdetailModel.afterObject.doiPoolが、その名前を参照しているため、何も起こりません。

detailModel.afterObject.doiPool入力フィールドで直接編集できない場合でも、検証を強制的にオンにするにはどうすればよいですか?

4

2 に答える 2

2

無効な入力は、フォーム送信の処理中にスキップされます。

レンダリング レスポンス以外のフェーズでポストバック中に属性disabledを評価します。false

<h:inputText ... disabled="#{not facesContext.postback or facesContext.renderResponse}" />

falseこのようにして、フォームの送信中に評価され、処理に含まれます。

于 2013-02-15T12:15:32.320 に答える
1

BalusCの回答への追加として:

はオブジェクト@NotNullに指定されており、DoiPool彼の名前ではありません (テキスト フィールドに表示されていました)。これを機能させるには、テキスト フィールドを検証済みフィールドにバインドする必要があります。

<h:inputText
  id       = "doiPool"
  value    = "#{detailModel.afterObject.doiPool}"
  disabled = "#{facesContext.renderResponse}"
>
    <f:converter converterId="ch.ethz.id.wai.doi.DoiPoolConverter"></f:converter>
</h:inputText>

コンバーターは単にgetName()オブジェクトの を返します。

@FacesConverter( "ch.ethz.id.wai.doi.DoiPoolConverter" )
public class DoiPoolConverter implements Converter
{

    /**
     * This converter works only in the other direction.
     *
     * @return null
     */
    @Override
    public Object getAsObject( FacesContext facesContext, UIComponent uiComponent, String string )
    {
            return null;
    }

    @Override
    public String getAsString( FacesContext facesContext, UIComponent uiComponent, Object object )
    {
            if ( object instanceof DoiPool )
            {
                    return ( (DoiPool)object ).getName();
            }
            return null;
    }
}
于 2013-02-15T16:59:17.773 に答える