避免在JPA中验证@Size注释

时间:2012-12-20 17:02:23

标签: validation jsf jpa

我有一个具有以下属性的JPA实体:

public class Person implements Serializabe {
...
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "name", nullable = false, length = 45)
private String name;
...

它的观点是:

<h:outputLabel value="Name: "/>           
<h:inputText id="name"
             value="#{personBean.person.name}"
             validator="#{personValidator.validate}"/>
<rich:message for="name"/>

personValidator检查0&lt; name.length&lt; 45如果它已经存在于数据库中;它工作正常。当我尝试添加一个空名称或大于45个字符时,我得到了正确的验证器消息,但在Glassfish输出中显示:

INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=contentForm:name[severity=(ERROR 2), summary=(size must be between 1 and 45), detail=(size must be between 1 and 45)]

我尝试将<validation-mode>NONE</validation-mode>添加到我的persistence.xml但没有效果。如何避免此@Size注释验证?

2 个答案:

答案 0 :(得分:4)

您看到的消息是因为已发出面部消息(可能来自验证器),但可能尚未显示。

在这种情况下,@Size注释来自Bean验证,由JPA和JSF处理。

除非您手动生成来自支持bean的消息(例如,在您的业务逻辑中放置一个try / catch),否则这个消息实际上来自JSF并且禁用JPA persistence.xml中的任何内容都不会产生任何影响。

您可以通过在输入组件中嵌套f:validateBean标记并将disabled属性设置为true来禁用JSF验证。见Temoporarily suppress beanvalidation with JSF

答案 1 :(得分:2)

您可以通过添加validateBean标记来禁用特定输入的验证:

<h:outputLabel value="Name: "/>           
<h:inputText id="name"
             value="#{personBean.person.name}"
             validator="#{personValidator.validate}">
    <f:validateBean disabled="true"/>
</h:inputText>
<rich:message for="name"/>