Hibernate JSF中禁用的Bean验证在提交后重新启用
给定:带有一些输入字段的JSF2表单,包括密码字段 主要目标:如果密码字段留空(导致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
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验证也在JPAEntityManager#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验证也在JPAEntityManager#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
,您可以在JARhibernate validator-.JAR/org/hibernate/validator中找到该消息
看来你是对的,验证器在某处回击了你。当通过JSF呈现这些消息时,一些消息包会保存
javax.faces.validator.BeanValidator.MESSAGE = {1} {0}
因此,该消息类似于:“password”darf nicht null sein。在您的项目中,此项已更改(在消息属性中查找密钥),或者验证可能是从其他地方开始的(Hibernate persisting?)。消息“darf nicht null sein”来自验证消息的属性,您可以在JARhibernate 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
,您可以在JARhibernate 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
,您可以在JARhibernate validator-.JAR
的/org.hibernate.validator
下找到该消息。看来你是对的,验证器在某处回击了你。当通过JSF呈现这些消息时,一些消息包会保存javax.faces.validator.BeanValidator.message={1}{0}
,因此消息类似于:“password”darf nicht null sein。
在您的项目中,这一点已经更改(在消息属性中查找密钥)或者验证可能从其他地方开始(持续?)。