2016-03-06 77 views
0

我正在使用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

回答

1

这是正常的行为。验证在JSF的“流程验证阶段”中进行处理。此阶段在“更新模型值”阶段之前计算。这意味着如果验证失败,您的模型(Bean)将不会使用无效值进行更新。 “工艺验证阶段”之后的所有阶段将被跳过,并且将执行“渲染响应阶段”。结果是当您的无效字段被重新渲染时,它仍然会显示旧值,因为该模型尚未更新。

在“渲染响应阶段”中,您现在可以显示错误消息< h:消息>。我能想到的防止旧模型值显示的唯一方法是使用ajax-Element,而不是在呈现响应阶段呈现输入元素,而是仅呈现其错误消息。

所以在你的XHTML:

<h:outputLabel for="name">#{i18n['name']}</h:outputLabel> 
<h:inputText id="name" label="#{i18n['name']}" value="#{configuracionesBean.configuraciones.name}"> 
    <f:ajax event="valueChange" render="errorBlock" /> 
</h:inputText> 
<h:panelGroup id="errorBlock"> 
    <h:message for="name" errorClass="error" warnClass="warn" infoClass="info"/> 
</h:panelGroup> 

以下链接可能会有所帮助

JSF生命周期说明:http://developersbook.com/jsf/images/JSF-Lifecycle.png

JSF生命周期:https://docs.oracle.com/javaee/1.4/tutorial/doc/JSFIntro10.html#wp122256