4

私はいくつかのBeanValidationを試していますが、「奇妙な」動作に遭遇しています。私はフロントエンドとしてGlassfishとPrimefacesを使用しています(違いがある場合)。私のプロジェクトの他の場所では、Hibernate-validatorを使用していますが、JSFを検証しているかどうかはわかりません(そうでない場合は、Glassfishのデフォルトです)。私はマネージドBeanを持っています:

@javax.faces.bean.ManagedBean
@javax.faces.bean.ViewScoped
public class TestBean
{
    @Size(min=8)
    private String _testString;

    public String getTestString()
    {
        return _testString;
    }

    public String setTestString(String testString)
    {
        _testString = testString;
    }

    public void doSomethind()
    {
        // Do something with the test string
    }
}

そしてこれを含むJSFページ:

<h:form id="testForm">
    <h:outputLabel for="testInput" value="Input:"/>
    <p:inputText id="testInput" value="#{testBean.testString}"/>
    <p:message id="testInputMsg" for="testInput"/>
    <p:commandButton value="Aanmaken" action="#{testBean.doSomething}" update="@form"/>
</h:form>

はこの_testString方法で検証されません。ただし、フィールドを次のように変更すると、BeanValidationは機能します。

@Size(min=8)
private String testString;

または、フィールドの代わりにゲッターに注釈を付ける場合:

private String _testString;

@Size(min=8)
public String getTestString()
{
    return _testString;
}

コーディングガイドラインに従って、プライベートフィールドの前にアンダースコアを付ける必要があります。それは私に1つの選択肢を残します。ゲッターに注釈を付けます。

誰かがなぜそれがこのように振る舞うのか説明するのを気にかけることができますか?

4

1 に答える 1

4

JSR 303仕様から:

3.2。制約宣言

制約宣言は、主にアノテーションを介してクラスまたはインターフェースに配置されます。制約アノテーション(セクション2.1を参照)は、タイプ、タイプのフィールドのいずれか、またはJavaBeans準拠のプロパティのいずれかに適用できます。

(強調鉱山)

JavaBeans仕様から:

8.3.1単純なプロパティ

デフォルトでは、デザインパターンを使用して、次の形式のメソッドを探してプロパティを検索します。

public <PropertyType> get<PropertyName>();
public void set<PropertyName>(<PropertyType> a);

したがって、プロパティ名が、の場合、呼び出され_testStringたゲッター/セッターを探していますが、これはあなたのケースには存在しません。get_testString()set_testString()

コードガイドラインがJavaBeans仕様と競合しているため、名前がJavaBeans仕様と競合しているプロパティにアノテーションを付けると、JSR-303Bean検証が機能しなくなります。JSR-303は、プロパティ名に関連付けられたゲッター/セッターを見つけることができないため、呼び出されたときに検証を実行できません。

標準に準拠するようにコードガイドラインを修正するか、代わりにゲッターにアノテーションを付けてそれを使用してください。さらに、標準のJavaコード規約も参照してください。

于 2012-06-17T21:22:31.410 に答える