JAVA参数验证 Validation(一)
现状:部分人验证参数时,是在每个方法内对每一个参数进行一一验证;但是如果这些参数在多个接口共同会使用到,就会增加一部分重复代码劳作,如果能将这些参数验证放到一起,那么代码将会变得更加简洁。
现状
@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; }
下面贴上部分校验规则: