1.通常我们在编写业务代码时,会对各种参数进行验证,比如是否空值,是否小于0等。
2.如果参数异常我们会抛出异常或者直接返回null等。
3.之前都是进行硬编码验证参数,其实有更好的方案,就是用javax提供的validation接口进行验证。下面简单描述下接入validation过程:
(1)使用Validator类进行验证,和使用log日志很相似,比如我们用logFactory get一个log出来,同理,我们的Validator也是用ValidatorFactory getValidator取得的,都是采用SPI方式加载具体的实现类。
(2)由(1)可知,我们还需要一个提供Validator的一个实现,就如org.slfj提供log门面,具体实现是log4j或者logback,那么这里的Validator的实现是hibernate.validator提供的实现。
(3)引入javax.validation和hibernate.validator jar包,编写代码即可。
4.下面show code 例子
TestValidation 测试类
package com.validation;
public class TestValidation {
public static void main(String args[]) {
ValidationServices service = new ValidationServices();
TradeParam param = new TradeParam();
param.setName("abc");
ValidationResult result = service.validate(param, false);
System.out.println(result.getFirstFailedReason());
for(String str:result.getFailedReasonList()){
System.out.println(str);
}
}
}
TradeParam需要验证的参数类
package com.validation;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
public class TradeParam implements Serializable {
private static final long serialVersionUID = 2034770424591442543L;
@NotNull
private String name;
@NotNull
private String tradeNo;
@NotNull
private Long orderId;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
}
ValidationServices验证包装服务类
package com.validation;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
public class ValidationServices {
private static final int FAST_ONE = 1;
private Validator validator;
public ValidationServices(){
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator = validatorFactory.getValidator();
}
public ValidationResult validate(Object param, boolean fastMode) {
ValidationResult result = new ValidationResult();
Set<ConstraintViolation<Object>> violations = validator.validate(param);
boolean isEmpty = violations.isEmpty();
result.setPassed(isEmpty);
if(!isEmpty){
List<String> failedReasonList = new ArrayList<String>(fastMode?FAST_ONE:violations.size());
for(ConstraintViolation<Object> violation:violations){
StringBuilder sb = new StringBuilder(violation.getPropertyPath().toString());
sb.append(violation.getConstraintDescriptor().getAnnotation().annotationType().getSimpleName());
String reason = sb.toString();
failedReasonList.add(reason);
if(fastMode){
break;
}
}
result.setFailedReasonList(failedReasonList);
}
return result;
}
}
ValidationResult验证结果包装类
package com.validation;
import java.io.Serializable;
import java.util.List;
public class ValidationResult implements Serializable{
/**
*
*/
private static final long serialVersionUID = 6179722435523455762L;
private boolean passed;
private List<String> failedReasonList;
public String getFirstFailedReason(){
return (null != failedReasonList && !failedReasonList.isEmpty())?failedReasonList.get(0):null;
}
public boolean isPassed(){
return passed;
}
public void setPassed(boolean passed){
this.passed = passed;
}
public List<String> getFailedReasonList(){
return failedReasonList;
}
public void setFailedReasonList(List<String> failedReasonList){
this.failedReasonList = failedReasonList;
}
}
下面是运行结果:
orderIdNotNull
orderIdNotNull
tradeNoNotNull