我正在尝试一些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
未通过此方式验证。但是,当我将字段更改为:
@Size(min=8)
private String testString;
或当我注释吸气剂而不是现场时:
private String _testString;
@Size(min=8)
public String getTestString()
{
return _testString;
}
遵循我们的编码指南,我们必须在私有字段前加下划线。这让我有一个选择;注释吸气剂。
有人可以解释为什么会这样吗?
答案 0 :(得分:4)
3.2。约束声明
约束声明主要通过注释放在类或接口上。约束注释(参见第2.1节)可以应用于类型,任何类型的字段或任何 JavaBeans兼容的属性。
(强调我的)
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。