Hibernate Validator5.4.2--使用XML配置

7.通过XML配置

到目前为止,我们使用的都是注解。但是,也存在两种允许通过XML进行配置的XML描述符。第一个描述符描述了通用的Bean验证行为,并以META-INF / validation.xml的形式提供。第二个描述了约束声明,并通过注解与约束声明紧密匹配。

XSD文件可通过:
http://www.jboss.org/xml/ns/javax/validation/configuration
http://www.jboss.org/xml/ns/javax/validation/mapping获取。

7.1.在validation.xml中配置验证器工厂

启用Hibernate Validator的XML配置的关键是META-INF / validation.xml文件。如果此文件存在于类路径中,则ValidatorFactory 在创建时将应用其配置。下图是validation.xml必须遵守的XML模式的模型视图:

图1

下面的xml文件显示了validation.xml的几个配置选项。 所有设置都是可选的,同样的配置选项也可以通过javax.validation.Configuration以编程方式提供。实际上,XML配置将被通过编程API显式指定的值覆盖。甚至可以通过Configuration#ignoreXmlConfiguration()完全忽略XML配置。 另请参阅8.2.配置一个ValidatorFactory。

<validation-config
    xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">

    <default-provider>com.acme.ValidationProvider</default-provider>

    <message-interpolator>com.acme.MessageInterpolator</message-interpolator>
    <traversable-resolver>com.acme.TraversableResolver</traversable-resolver>
    <constraint-validator-factory>
        com.acme.ConstraintValidatorFactory
    </constraint-validator-factory>
    <parameter-name-provider>com.acme.ParameterNameProvider</parameter-name-provider>

    <executable-validation enabled="true">
        <default-validated-executable-types>
            <executable-type>CONSTRUCTORS</executable-type>
            <executable-type>NON_GETTER_METHODS</executable-type>
            <executable-type>GETTER_METHODS</executable-type>
        </default-validated-executable-types>
    </executable-validation>

    <constraint-mapping>META-INF/validation/constraints-car.xml</constraint-mapping>

    <property name="hibernate.validator.fail_fast">false</property>
</validation-config>

注意:在类路径中只能有一个名为META-INF / validation.xml的文件。如果发现多于一个,则抛出异常。

default-provider标签允许选择Bean验证提供程序,如果类路径中有多个提供程序,则这很有用。message-interpolator, traversable-resolver, constraint-validator-factory和parameter-name-provider标签允许自定义javax.validation包下的MessageInterpolator, TraversableResolver, ConstraintValidatorFactory和ParameterNameProvider接口的实现,有关这些接口的更多信息,请参阅8.2.配置一个ValidatorFactory部分章节。

executable-validation及其子标签定义方法验证的默认值。Bean Validation规范将构造函数和非getter方法定义为默认值。enabled属性作为全局开关来打开或关闭方法验证。

可以通过constraint-mapping标签列出任意数量的附加XML文件,其中包含实际的约束配置。映射文件名必须使用它们classpath下的完全限定名来指定。

可以通过property节点指定提供程序特定的属性。在这个例子中,我们使用了Hibernate Validator特定的属性hibernate.validator.fail_fast(见11.2.快速失败模式)。

7.2.通过映射约束constraint-mappings

可以通过遵循Validation mapping schema的XML文件来声明约束。注意,这些映射文件只有在validation.xml中的 constraint-mapping标签列出时才会被处理。
图2

下面通过XML配置Bean约束:

<constraint-mappings
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd"
    xmlns="http://jboss.org/xml/ns/javax/validation/mapping" version="1.1">

    <default-package>org.hibernate.validator.referenceguide.chapter05</default-package>
    <bean class="Car" ignore-annotations="true">
        <field name="manufacturer">
            <constraint annotation="javax.validation.constraints.NotNull"/>
        </field>
        <field name="licensePlate">
            <constraint annotation="javax.validation.constraints.NotNull"/>
        </field>
        <field name="seatCount">
            <constraint annotation="javax.validation.constraints.Min">
                <element name="value">2</element>
            </constraint>
        </field>
        <field name="driver">
            <valid/>
        </field>
        <getter name="passedVehicleInspection" ignore-annotations="true">
            <constraint annotation="javax.validation.constraints.AssertTrue">
                <message>The car has to pass the vehicle inspection first</message>
                <groups>
                    <value>CarChecks</value>
                </groups>
                <element name="max">10</element>
            </constraint>
        </getter>
    </bean>
    <bean class="RentalCar" ignore-annotations="true">
        <class ignore-annotations="true">
            <group-sequence>
                <value>RentalCar</value>
                <value>CarChecks</value>
            </group-sequence>
        </class>
    </bean>
    <constraint-definition annotation="org.mycompany.CheckCase">
        <validated-by include-existing-validators="false">
            <value>org.mycompany.CheckCaseValidator</value>
        </validated-by>
    </constraint-definition>
</constraint-mappings>

通过XML配置方法约束:

<constraint-mappings
        xmlns="http://jboss.org/xml/ns/javax/validation/mapping"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation=
                "http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd" version="1.1">

    <default-package>org.hibernate.validator.referenceguide.chapter07</default-package>

    <bean class="RentalStation" ignore-annotations="true">
        <constructor>
            <return-value>
                <constraint annotation="ValidRentalStation"/>
            </return-value>
        </constructor>

        <constructor>
            <parameter type="java.lang.String">
                <constraint annotation="javax.validation.constraints.NotNull"/>
            </parameter>
        </constructor>

        <method name="getCustomers">
            <return-value>
                <constraint annotation="javax.validation.constraints.NotNull"/>
                <constraint annotation="javax.validation.constraints.Size">
                    <element name="min">1</element>
                </constraint>
            </return-value>
        </method>

        <method name="rentCar">
            <parameter type="Customer">
                <constraint annotation="javax.validation.constraints.NotNull"/>
            </parameter>
            <parameter type="java.util.Date">
                <constraint annotation="javax.validation.constraints.NotNull"/>
                <constraint annotation="javax.validation.constraints.Future"/>
            </parameter>
            <parameter type="int">
                <constraint annotation="javax.validation.constraints.Min">
                    <element name="value">1</element>
                </constraint>
            </parameter>
        </method>
    </bean>

    <bean class="Garage" ignore-annotations="true">
        <method name="buildCar">
            <parameter type="java.util.List"/>
            <cross-parameter>
                <constraint annotation="ELAssert">
                    <element name="expression">...</element>
                    <element name="validationAppliesTo">PARAMETERS</element>
                </constraint>
            </cross-parameter>
        </method>
        <method name="paintCar">
            <parameter type="int"/>
            <return-value>
                <constraint annotation="ELAssert">
                    <element name="expression">...</element>
                    <element name="validationAppliesTo">RETURN_VALUE</element>
                </constraint>
            </return-value>
        </method>
    </bean>

</constraint-mappings>

一个给定的类只能在所有配置文件中配置一次。对于给定的约束注解,同样适用于约束定义。它只能出现在一个映射文件中。如果违反了这些规则,则抛出ValidationException。

将ignore - annotation设置为true意味着对已配置在bean上的约束注解将被忽略。ignore- annotation也可用于字段、getter、构造函数、方法、参数、交叉参数和返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值