利用validation完成對控制層的VO類進行校驗
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
@Configuration
public class ValidatorConfiguration {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
//設(shè)置validator模式為快速失敗返回
postProcessor.setValidator(validator());
return postProcessor;
}
@Bean
public Validator validator(){
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
.addProperty( "hibernate.validator.fail_fast", "true" )
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
return validator;
}
}
這里利用springboot進行開發(fā),@Configuration相當于之前的xml配置文件與,@Bean表示之前的一個bean類.
public class BaseVO implements Serializable {
private static final long serialVersionUID = -7265112497823460621L;
// 令牌
@NotNull(message="商家登錄超時,或在其它設(shè)備登錄!")
String token;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
這里簡單創(chuàng)建一個VO類,在token的上面使用@notnull注解,并給message賦值.
public <T> void validate(T o) {
Set<ConstraintViolation<T>> violationSet = validator.validate(o);
boolean result = true;
logger.debug(request.getRequestURI() + " validate,params is {}",o);
String message = null;
for (ConstraintViolation<T> model : violationSet) {
message = model.getMessage();
logger.warn(message);
result = false;
}
if(!result) {
throw new ValidateException(message);
}
}
將validate方法放入BaseController中,當然,這里的validator是注入進來的,代碼省略了.項目在啟動的時候,會校驗token是否為空,當發(fā)現(xiàn)token為空時,set集合便有值,然后拋出異常.這時候需要定義一個全局異常.這樣就可以了.
@ControllerAdvice
public class CommExceptionHandle {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Map<String, Object> handle(Exception e) {
Map<String, Object> map = new HashMap<String, Object>();
if (e instanceof ValidateException) {
map.put("status", BusinessErrorCode.PARAMS_EXCEPTION.getCode());
map.put("remark", e.getMessage());
return ResponseData.takeResponseData(map);
}else {
map.put("status", BusinessErrorCode.SYSTEM_ERROR.getCode());
map.put("remark", BusinessErrorCode.SYSTEM_ERROR.getDesc());
return ResponseData.takeResponseData(map);
}
}
}