【发布时间】:2016-06-19 21:52:22
【问题描述】:
我正在使用 JSF 2 (MyFaces 2.2.9) 和 Bean Validation (Hibernate Validator 5.2.2.Final)。
我在一个 bean 上使用 @NotNull 注释,它是我的托管 bean 的一个属性。
(ManagedBean 类)
@ManagedBean
public class ConfiguracionesBean {
private Configuraciones configuraciones;
@PostConstruct
public void postConstruct() {
this.configuraciones = Configuraciones.find();
}
//getters/setters/unrelevant code
...
}
(豆类)
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 验证器(我知道也可以这样做)。
亚历克斯
【问题讨论】:
标签: jsf-2.2 bean-validation myfaces