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模式的模型视图:
下面的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标签列出时才会被处理。
下面通过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、构造函数、方法、参数、交叉参数和返回值。