Hibernate Validator5.4.2--使用XML配置

来源:互联网 发布:网络女主播yy 编辑:程序博客网 时间:2024/06/01 10:22

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、构造函数、方法、参数、交叉参数和返回值。

阅读全文
0 0
原创粉丝点击