【问题标题】:JSF 2 : Bean Validation JSR 303 notnull : The model value is returnedJSF 2:Bean Validation JSR 303 notnull:返回模型值
【发布时间】: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


    【解决方案1】:

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

    在“渲染响应阶段”中,您现在可以使用 显示错误消息。我能想到的防止旧模型值显示的唯一方法是使用 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

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 2012-03-30
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 2011-10-01
      • 2014-05-01
      • 1970-01-01
      相关资源
      最近更新 更多