空输入值不会触发@NotNull但会触发@NotBlank

时间:2011-11-23 00:47:12

标签: jsf-2 bean-validation

我有这个实体:

import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotBlank;

@Entity
@XmlRootElement
@Table
public class Supplier extends AbstractEntity
{
    @Column
    @NotNull
    private String name;

    @Column
    @NotBlank
    private String representative;

    ...
}

和这个jsf形式:

<h:form>
    <p:commandButton value="save" action="#{supplierController.create}" ajax="false"/>

    <h:panelGrid columns="3" cellpadding="4">
        <h:outputLabel value="#{bundle['Name']}" for="name"/>
        <p:inputText id="name" value="#{supplierController.value.name}"/>
        <p:message for="name"/>

        <h:outputLabel value="#{bundle['Representative']}" for="representative"/>
        <p:inputText id="representative" value="#{supplierController.value.representative}"/>
        <p:message for="representative"/>
    </h:panelGrid>
</h:form>

那么,为什么@NotBlank被触发而@NotNull不是?

我在glassfish-3.1.1下使用mojarra-2.1.3_01(发布hibernate-validator-4.2.0.Final?)

1 个答案:

答案 0 :(得分:3)

由于HTTP的性质,空请求参数被检索为空字符串而不是null。因此永远不会触发@NotNull验证器。只有在表单中缺少字段或禁用字段时才会触发它。

但是,您可以通过将以下上下文参数添加到web.xml来配置JSF 2.x以将空提交的值解释为null:

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

这样,将为空字段触发@NotNull