Hibernate JSF中禁用的Bean验证在提交后重新启用

Hibernate JSF中禁用的Bean验证在提交后重新启用,hibernate,jpa,jsf-2,bean-validation,Hibernate,Jpa,Jsf 2,Bean Validation,给定:带有一些输入字段的JSF2表单,包括密码字段 主要目标:如果密码字段留空(导致password.isEmpty()==true或password==null),则应跳过验证和密码绑定 禁止:单独的DTO(我知道这样会更干净,但不允许我决定) view.xhtml: <h:form id="someForm"> <h:outputLabel value="Password " /> <h:inputSecret id="password" val

给定:带有一些输入字段的JSF2表单,包括密码字段

主要目标:如果密码字段留空(导致
password.isEmpty()==true
password==null
),则应跳过验证和密码绑定

禁止:单独的DTO(我知道这样会更干净,但不允许我决定)

view.xhtml:

<h:form id="someForm">
    <h:outputLabel value="Password " />
    <h:inputSecret id="password" value="#{myBackingBean.entity.password}" immediate="true" redisplay="false" required="false">
        <f:validateBean disabled="true"/>
        <f:validator validatorId="myPasswordValidator"/>
    </h:inputSecret>
    <p:message for="password" />
    <p:commandButton value="Save" update="someForm">
        <f:actionListener binding="#{myBackingBean.updateEntityAction()}" />
    </p:commandButton>
</h:form>
MyBackingBean.java:

@ManagedBean(name = "myBackingBean")
@ViewScoped
public class MyBackingBean extends GenericBackingBean<....> {

    public ActionListener updateEntityAction(){
    return new ActionListener() {
      @Override
      public void processAction(ActionEvent event)
          throws AbortProcessingException {
          // .... hybernate stuff
        }
      };
  }
}
这实际上是可行的,但只适用于第一次提交,第一次提交后的每次提交都会导致一条错误消息(没有例外……可能在某处被吃掉……?)。有趣的是,消息上写着“kann nicht null sein”(德语),而我实际上不知道是谁或什么在产生这条消息

我的结论是,在第一次提交之后,默认bean验证再次被激活


有什么想法吗?

此消息来自JSR303 bean验证注释
@NotNull
。默认情况下,JSR303 bean验证也在JPA
EntityManager#persist()和
update()期间执行

就像您可以通过
在JSF中禁用JSR303 bean验证一样,您也可以通过
persistence.xml
中的以下条目在JPA中禁用JSR303 bean验证:

<validation-mode>none</validation-mode>
请记住,这会影响所有JSR303 bean验证注释。您可能希望删除
@NotNull
并使用条件
required=“true”

另见:

此消息来自JSR303 bean验证注释
@NotNull
。默认情况下,JSR303 bean验证也在JPA
EntityManager#persist()和
update()期间执行

就像您可以通过
在JSF中禁用JSR303 bean验证一样,您也可以通过
persistence.xml
中的以下条目在JPA中禁用JSR303 bean验证:

<validation-mode>none</validation-mode>
请记住,这会影响所有JSR303 bean验证注释。您可能希望删除
@NotNull
并使用条件
required=“true”

另见:
消息“darf nicht null sein”来自
ValidationMessages\u de.properties
,您可以在JAR
hibernate validator-.JAR/org/hibernate/validator中找到该消息

看来你是对的,验证器在某处回击了你。当通过JSF呈现这些消息时,一些消息包会保存

javax.faces.validator.BeanValidator.MESSAGE = {1} {0}
因此,该消息类似于:“password”darf nicht null sein。在您的项目中,此项已更改(在消息属性中查找密钥),或者验证可能是从其他地方开始的(Hibernate persisting?)。

消息“darf nicht null sein”来自
验证消息的属性,您可以在JAR
hibernate validator-.JAR/org/hibernate/validator
中找到一个

看来你是对的,验证器在某处回击了你。当通过JSF呈现这些消息时,一些消息包会保存

javax.faces.validator.BeanValidator.MESSAGE = {1} {0}

因此,该消息类似于:“password”darf nicht null sein。在您的项目中,此项已更改(在消息属性中查找密钥),或者验证可能是从其他地方开始的(Hibernate persisting?)。

找到了此问题的非黑客解决方案

而不是写:

<h:inputSecret id="password" value="#{myBackingBean.entity.password}" immediate="true" redisplay="false" required="false">
    <f:validateBean disabled="true"/>
    <f:validator validatorId="myPasswordValidator"/>
</h:inputSecret>

我不得不写:

<f:validateBean disabled="true">
<h:inputSecret id="password" value="#{myBackingBean.entity.password}" immediate="true" redisplay="false" required="false">
    <f:validator validatorId="myPasswordValidator"/>
</h:inputSecret>
</f:validateBean>

第一个变体在post请求中无法生存


无论如何,谢谢你的提示和问候

找到了这个问题的非黑客解决方案

而不是写:

<h:inputSecret id="password" value="#{myBackingBean.entity.password}" immediate="true" redisplay="false" required="false">
    <f:validateBean disabled="true"/>
    <f:validator validatorId="myPasswordValidator"/>
</h:inputSecret>

我不得不写:

<f:validateBean disabled="true">
<h:inputSecret id="password" value="#{myBackingBean.entity.password}" immediate="true" redisplay="false" required="false">
    <f:validator validatorId="myPasswordValidator"/>
</h:inputSecret>
</f:validateBean>

第一个变体在post请求中无法生存

无论如何,谢谢你的提示和问候

“kann-nicht-null-sein”听起来确实像是Hibernate验证。通常,当这个验证由JSF完成时,保存该值的字段被添加为前缀。消息“darf nicht null sein”来自
ValidationMessages\u de.properties
,您可以在JAR
hibernate validator-.JAR
/org.hibernate.validator
下找到该消息。看来你是对的,验证器在某处回击了你。当通过JSF呈现这些消息时,一些消息包会保存
javax.faces.validator.BeanValidator.message={1}{0}
,因此消息类似于:
“password”darf nicht null sein。
在您的项目中,这一点已经更改(在消息属性中查找密钥)或者验证可能是从其他地方开始的(持续?)“kann-nicht-null-sein”听起来确实像Hibernate验证。通常,当这个验证由JSF完成时,保存该值的字段被添加为前缀。消息“darf nicht null sein”来自
ValidationMessages\u de.properties
,您可以在JAR
hibernate validator-.JAR
/org.hibernate.validator
下找到该消息。看来你是对的,验证器在某处回击了你。当通过JSF呈现这些消息时,一些消息包会保存
javax.faces.validator.BeanValidator.message={1}{0}
,因此消息类似于:
“password”darf nicht null sein。
在您的项目中,这一点已经更改(在消息属性中查找密钥)或者验证可能从其他地方开始(持续?)。