如果名称变量以下划线为前缀,则Bean验证不起作用

时间:2012-06-17 21:09:44

标签: java jsf glassfish bean-validation

我正在尝试一些bean验证,我绊倒'奇怪'的行为。我正在使用Glassfish和Primefaces作为前端(如果它有任何区别)。在我的项目的其他地方,我使用Hibernate验证器,我不确定它是否验证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未通过此方式验证。但是,当我将字段更改为:

时,bean验证确实有效
@Size(min=8)
private String testString;

或当我注释吸气剂而不是现场时:

private String _testString;

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

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

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

1 个答案:

答案 0 :(得分:4)

来自JSR 303 specification

  

3.2。约束声明

     

约束声明主要通过注释放在类或接口上。约束注释(参见第2.1节)可以应用于类型,任何类型的字段或任何 JavaBeans兼容的属性。

(强调我的)

来自JavaBeans specification

  

8.3.1简单属性

     

默认情况下,我们使用设计模式通过查找表单的方法来定位属性:

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

因此,如果属性名称为_testString,则会查找名为get_testString()set_testString()的getter / setter,但在您的情况下不存在。

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

修复代码指南以符合标准,或者将注释放在getter上,然后使用它。另请参阅Standard Java Code Conventions