当前位置: 首页 > 知识库问答 >
问题:

JSF 2:Bean验证JSR 303 notnull:返回模型值

应子真
2023-03-14

我正在使用JSF2(MyFaces2.2.9)和Bean验证(Hibernate Validator5.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
    ...

}

(Bean类)

public class Configuraciones {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @NotNull
    private String name;
}  
<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"/>
<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

预先感谢您的回答。
注意:我真的希望坚持只由JSR303完成的验证,因为这样我就有了一种处理约束的统一方法。所以没有JSF验证器(我知道它可以做同样的事情)。

亚历克斯

共有1个答案

牛枫
2023-03-14

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

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

 类似资料:
  • 我使用Spring 3.2.2与Primeface 4.0和Hibernate 4.2。我在我的实体上有JSR303验证注释,并且我配置了Spring来在服务层验证它们——这很好。 但是我希望在调用服务之前启动JSF验证,但事实并非如此。我所做的所有研究都表明,我只需在类路径中添加一个验证程序,JSF2就会自动应用。 我已将建议的JAR添加到我的类路径中: 完整的依赖关系树可以在https://g

  • 对于错误的响应,是否可能在响应中返回验证注释消息?我认为这是可能的,但我注意到我们的项目没有给出详细的不良请求信息。 如果请求缺少IDField,我希望返回“IDField is required”。我用的是泽西2.0。我看到的回应是...

  • 我有一个JSF2应用程序,但我无法对JSF ManagedBean属性进行@email验证。 这是我的堆栈: GlassFish 3.1.1 Mojarra 2.2.9/JSF 2.2 null 我的代码: 托管bean: 备注: null 谢谢你。

  • 我正在尝试使用hibernate validator将bean验证集成到我的web应用程序中:< br >-Hibernate-spring-JSF 2-primefaces 3 on Tomcat 7 < br >我在Netbeans的类路径中添加了以下jar文件:hibernate-validator.jar和validation-api.jar。 在pojo类中,我为Size添加了注释: 在

  • 我正在处理一个Spring Boot java服务,该服务包含一个Camel处理器类,如下所示: 当我运行它时,我得到一个失败,声明对1*LogService.Update(_)的调用太少(0个调用)。我试着调试代码,在MyProc中,语句被命中,并且logService对象在高亮显示时(在Eclipse中)状态为“mock for type logService named$spock_shar

  • 这个问题已经被问了很多次了,即使是在经历了所有的解决方案之后,我也无法让hibernate validator工作。 控制器类:- servlet-上下文:- 依赖关系:- 验证类:- 我错过了什么?