Notice:本文對(duì)Validation api的使用主要是運(yùn)用了Hibernate-Validator,其中Hibernate-Validator是validation-api的官方擴(kuò)展,使用的pom如下:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
基于XML的校驗(yàn)
validation-api支持Java Bean和校驗(yàn)脫離,就是可以不在一起,這點(diǎn)方便Api定義者可以Java Bean,但是不添加校驗(yàn)功能,而實(shí)現(xiàn)者能夠針對(duì)Java Bean的定義來決定是否需要校驗(yàn)
例如,
數(shù)據(jù)模型:
public class OrderBaseModel {
public long id;
public String buyerCbAccoutId;
public String sellerCbAccoutId;
public OrderSatusEnum status;
public String buyerCompanyName;
public String sellerCompanyName;
public String buyerBizPhone;
public String sellerBizPhone;
public List offers = new ArrayList<>();
public String pickType;
public List receiveAddressGroups = new ArrayList<>();
public String message;
public double discountFee;
public double additionalFee;
public String payway;
public long payTimeout;
public Long autoConfirmReceipt;
public long appointedArrivalDate;
....get/set
}
校驗(yàn)邏輯:
<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">
//指定校驗(yàn)?zāi)P? <default-package>com.alibaba.cb.api.order.model</default-package>
<bean class="OrderBaseModel" ignore-annotations="true">
//Class級(jí)別校驗(yàn),并設(shè)置忽略注解的校驗(yàn)邏輯
<class ignore-annotations="true">
//支持jexl表達(dá)式的校驗(yàn)邏輯
<constraint annotation="org.hibernate.validator.constraints.ScriptAssert">
<message>{com.alibaba.cb.api.order.model.ordermodel.receiveAddressGroups}</message>
<element name="lang">jexl</element>
// 這里如果不設(shè)置別名,_this指的是當(dāng)前class的實(shí)例對(duì)象,可以取到任何一個(gè)對(duì)象中的屬性值進(jìn)行聯(lián)動(dòng)校驗(yàn)
<element name="script">
if(_this.pickType=='push' and size(_this.receiveAddressGroups) > 2){
return false;
}else if(_this.pickType=='pull' and size(_this.receiveAddressGroups) > 10){
return false;
}else if(size(_this.receiveAddressGroups) == 0) {
return false;
}
return true;
</element>
</constraint>
</class>
<field name="buyerCbAccoutId">
<constraint annotation="javax.validation.constraints.NotNull">
<message>{com.alibaba.cb.api.order.model.ordermodel.buyerCbAccoutId}</message>
</constraint>
</field>
<constraint annotation="javax.validation.constraints.Size">
<message>{com.alibaba.cb.api.order.model.ordermodel.buyerCompanyNameSize}</message>
<element name="max">20</element>
</constraint>
</field>
// 支持正則校驗(yàn)邏輯
<field name="sellerBizPhone">
<constraint annotation="javax.validation.constraints.Pattern">
<message>{com.alibaba.cb.api.order.model.ordermodel.sellerBizPhonePattern}</message>
<element name="regexp">^(|[0-9]{1,11})$</element>
</constraint>
</field>
<field name="offers">
<constraint annotation="javax.validation.constraints.Size">
<message>{com.alibaba.cb.api.order.model.ordermodel.offers}</message>
<element name="min">1</element>
</constraint>
</field>
<field name="pickType">
<constraint annotation="javax.validation.constraints.NotNull" >
<message>{com.alibaba.cb.api.order.model.ordermodel.pickType}</message>
</constraint>
</field>
<field name="discountFee">
<constraint annotation="javax.validation.constraints.DecimalMin">
<message>{com.alibaba.cb.api.order.model.ordermodel.discountFeeMin}</message>
<element name="value">0</element>
</constraint>
<constraint annotation="javax.validation.constraints.Digits">
<message>{com.alibaba.cb.api.order.model.ordermodel.discountFeeDigits}</message>
<element name="integer">6</element>
<element name="fraction">2</element>
</constraint>
</field>
<field name="additionalFee">
<constraint annotation="javax.validation.constraints.DecimalMin">
<message>{com.alibaba.cb.api.order.model.ordermodel.additionalFeeMin}</message>
<element name="value">0</element>
</constraint>
<constraint annotation="javax.validation.constraints.Digits">
<message>{com.alibaba.cb.api.order.model.ordermodel.additionalFeeDigits}</message>
<element name="integer">6</element>
<element name="fraction">2</element>
</constraint>
</field>
<field name="payway">
<constraint annotation="javax.validation.constraints.NotNull">
<message>{com.alibaba.cb.api.order.model.ordermodel.payway}</message>
</constraint>
</field>
<field name="payTimeout">
<constraint annotation="javax.validation.constraints.NotNull">
<message>{com.alibaba.cb.api.order.model.ordermodel.payTimeoutNotNull}</message>
</constraint>
//支持javascript表達(dá)式
<constraint annotation="org.hibernate.validator.constraints.ScriptAssert">
<message>{com.alibaba.cb.api.order.model.ordermodel.payTimeoutScript}</message>
<element name="lang">javascript</element>
<element name="script">
_this > new Date().getTime()
</element>
</constraint>
</field>
<field name="autoConfirmReceipt">
<constraint annotation="javax.validation.constraints.Min">
<message>{com.alibaba.cb.api.order.model.ordermodel.autoConfirmReceiptMin}</message>
<element name="value">5</element>
</constraint>
</field>
</bean>
</constraint-mappings>
從以上來看,xml其實(shí)就是annotation的另外一個(gè)翻版,但是意義卻比較大,可以實(shí)現(xiàn)定義和校驗(yàn)實(shí)現(xiàn)分離
實(shí)施:
Configuration<?> config = Validation.byDefaultProvider().configure();
//對(duì)于xml文件
config.addMapping(new FileInputStream(validationFile));
基于annotation的校驗(yàn)
暫無