作者邮箱:1911150175@qq.com
现状:部分人验证参数时,是在每个方法内对每一个参数进行一一验证;但是如果这些参数在多个接口共同会使用到,就会增加一部分重复代码劳作,如果能将这些参数验证放到一起,那么代码将会变得更加简洁。
现状
@Override
public RechargeResponse recharge(RechargeRequest request) {
if (request.getStar() <= 0 || request.getCurrencyAmount().compareTo(new BigDecimal(0)) <= 0) {
response.setCode(ErrorObjects.E1014.getErrorCode());
response.setDesc(ErrorObjects.E1014.getErrorDetail());
return response;
}
if (!CurrencyType.isExist(request.getCurrencyType())) {
response.setCode(ErrorObjects.E1015.getErrorCode());
response.setDesc(ErrorObjects.E1015.getErrorDetail());
return response;
}
if (!PayChannel.isExist(request.getPayChannel())) {
response.setCode(ErrorObjects.E1002.getErrorCode());
response.setDesc(ErrorObjects.E1002.getErrorDetail());
return response;
}
}
这里介绍到Validation来帮助验证参数
<!--validator start -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.0.Final</version>
</dependency>
<!--validator end -->
声明一个User对象,注册和登录接口需要
public class User implements Serializable {
@NotBlank(message = "用户名不能为空")
private String userName;
@NotBlank(message = "密码不能为空")
private String password;
}
这样我们在Controller层的传入参数就可以这样写
//直接抛出校验异常,外围统一处理
@RequestMapping(value = "/register", method = RequestMethod.POST)
@ResponseBody
public CommonResponse register(@Validated @RequestBody User user) {
CommonResponse response = new CommonResponse();
response.setCode(ErrorObjects.OK.getErrorCode());
response.setDesc(ErrorObjects.OK.getErrorDetail());
return response;
}
spring会验证传入参数是否符合User对象中参数验证规则,若不符合,则直接抛出异常(点击查看统一异常捕获方式),当然也可以在该方法直接处理校验异常(并不会抛出异常),如下,
//在方法内处理校验异常
@RequestMapping(value = "/register", method = RequestMethod.POST)
@ResponseBody
public CommonResponse register(@Validated @RequestBody User user, BindingResult result) {
CommonResponse response = new CommonResponse();
if (result.hasErrors()) {
result.getFieldError().getDefaultMessage();// 打印出第一个error消息
result.getFieldErrors();// 所有的error
}
return response;
}
下面贴上部分校验规则: