我正在使用JSF 2(MyFaces 2.2.9)和Bean验证(Hibernate Validator 5.2.2.Final)。JSF 2:Bean验证JSR 303 notnull:返回模型值
我对作为托管bean属性的bean使用@NotNull注释。
(ManagedBean类)
@ManagedBean
public class ConfiguracionesBean {
private Configuraciones configuraciones;
@PostConstruct
public void postConstruct() {
this.configuraciones = Configuraciones.find();
}
//getters/setters/unrelevant code
...
}
(Bean类)
public class Configuraciones {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@NotNull
private String name;
}
(.xhtml页面)
<h:outputLabel for="name">#{i18n['name']}</h:outputLabel>
<h:inputText id="name" label="#{i18n['name']}" value="#{configuracionesBean.configuraciones.name}" />
<h:message for="name" errorClass="error" warnClass="warn" infoClass="info"/>
第一时间显示在页面上, “名”输入文本字段包含先前存储在我的数据库中的值(正常情况下直到此处)。
如果我在html表单上删除了这个值,并且我提交了,那么@NotNull约束被触发,并且我得到一个错误(这里仍然正常)。
但是,html页面上显示的inputText的值是托管bean初始化时的值)。不是用户刚刚放置的“空”值(通过清空该字段)。因此,用户看到一个错误“该字段不能为空”,但该字段实际上包含以前的值。
有没有办法来防止这种情况?我希望输入是空的,因为它是用户放置的。
我准确的,我可以选择:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
预先感谢您的答案。
注意:我真的很想坚持仅由JSR 303完成的验证,就像这样我有一个统一的约束处理方法。所以没有JSF验证器(我知道这可以做同样的事情)。
Alex