具体实现:
1、本测试项目采用maven工程。在pom.xml文件中增加对validator.jar依赖的引入
由于这个项目是分布式的
所以我在parent项目的pom文件中添加jar包
<properties>
<version-hibernate-validate>5.4.0.Final</version-hibernate-validate>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${version-hibernate-validate}</version>
</dependency>
</dependencies>
</dependencyManagement>
2.配置是spring-mvc.xml(resource里面)
<!-- validation -->
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
<!-- 国际化配置 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
<!-- 注册验证器 -->
<mvc:annotation-driven validator="validator" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 这里配置将使用上面国际化配置的messageSource -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
3.建立统一处理
这个我是写在BaseExceptionController里面的,分销商controller里面的一个类用来捕获各种异常。(有点像工具类一样,个人理解)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public BaseResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
logger.error("参数验证失败", e);
BindingResult result = e.getBindingResult();
BaseResponse baseResponse = new BaseResponse();
// 取第一条返回
for (ObjectError error : result.getAllErrors()) {
String code = error.getCode();
String message = error.getDefaultMessage();
String description = String.format("%s:%s", code, message);
baseResponse.setData("400");
baseResponse.setSuccess(false);
baseResponse.setMsg(description);
break;
}
return baseResponse;
}
补充:
HttpStatus.BAD_REQUEST:表示报400.
@ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度
我们接口规范要求返回baseResponse(data,message,success)
4.在vo上面加上注解
vo和实体类是不同的(单一职责)
public class UserVO {
@NotEmpty(message="姓名不能为空")
private String name;
@Range(min=20,max=120,message="年龄在20到120岁之间")
private int age;
@NotEmpty(message="地址不能为空")
private String address;
... getter
... setter
}
5.测试controller
@Controller
@RequestMapping(value = "/operation/hello")
public class HelloController {
public static final Logger LOG = LoggerFactory.getLogger(HelloController.class);
@RequestMapping(value = "/testValidUser", method = RequestMethod.POST)
@ResponseBody
public String testValidUser(@RequestBody @Valid UserVO userVO){
return baseResponse.getMessage.toJSON();
}
}
6.测试结果
假设前端传的body是这样的
{
"name":"",
"age":130,
"address":""
}
接口返回的结果是:
{
"data": [
"年龄在20到120岁之间",
"姓名不能为空",
"地址不能为空"
],
"message": "参数不合法",
"success": false
}
补充:
/
* Bean Validation 中内置的 constraint
*
* @Null 被注释的元素必须为 null
* @NotNull 被注释的元素必须不为 null
* @AssertTrue 被注释的元素必须为 true
* @AssertFalse 被注释的元素必须为 false
* @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
* @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
* @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
* @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
* @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
* @Digits(integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
* @Past 被注释的元素必须是一个过去的日期
* @Future 被注释的元素必须是一个将来的日期
* @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
*
* Hibernate Validator 附加的 constraint
*
* @NotBlank(message =) 验证字符串非null,且长度必须大于0
* @Email 被注释的元素必须是电子邮箱地址
* @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
* @NotEmpty 被注释的字符串的必须非空
* @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
*/
**