4

我正在尝试一些 bean 验证,但我偶然发现了“奇怪”的行为。我正在使用 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不会以这种方式得到验证。但是,当我将字段更改为:

@Size(min=8)
private String testString;

或者当我注释 getter 而不是字段时:

private String _testString;

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

按照我们的编码指南,我们必须在私有字段前加上下划线。这让我只有一个选择;注释吸气剂。

有人可以解释为什么它会这样吗?

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,它正在寻找一个调用的 getter/setter get_testString(),并且set_testString()在您的情况下不存在。

您的代码指南与 JavaBeans 规范冲突,因此当您将注释放在名称与 JavaBeans 规范冲突的属性上时,JSR-303 bean 验证根本不起作用。JSR-303 找不到与属性名称关联的 getter/setter,因此在调用它们时将无法执行验证。

要么修复你的代码指南以符合标准,要么将注释放在 getter 上并使用它。另请参阅标准 Java 代码约定

于 2012-06-17T21:22:31.410 回答