三、注解验证
使用注解对数据进行合法性验证,可以说是 java 界一项非常伟大的创新,使用这种方式不仅使的代码变得很简洁,而且阅读起来非常令人赏心悦目!
3.1、依赖包引入
下面我们一起来看看具体的实践方式,以Spring Boot
工程为例,如果需要使用注解校验,直接引入spring-boot-starter-web
依赖包即可,会自动将注解验证相关的依赖包打入工程!
<!-- spring boot web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
下面在创建实体类的时候,还会用到lombok
插件,因此还需要引入lombok
依赖包!
<!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> <scope>provided</scope> </dependency>
如果是普通的Java
工程,引入以下几个依赖包即可!
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.9.Final</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.6</version> </dependency>
3.2、注解校验请求对象
紧接着我们来创建一个实体User
,用于模拟用户注册时的请求实体对象!
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class User { @NotBlank(message = "用户名不能为空!") private String userName; @Email(message = "邮箱格式不正确") @NotBlank(message = "邮箱不能为空!") private String email; @NotBlank(message = "密码不能为空!") @Size(min = 8, max = 16,message = "请输入长度在8~16位的密码") private String userPwd; @NotBlank(message = "确认密码不能为空!") private String confirmPwd; }
在web
层创建一个register()
注册接口方法,同时在请求参数上添加@Valid
,如下:
@RestController public class UserController { @RequestMapping("/register") public boolean register(@RequestBody @Valid User user){ if(!user.getUserPwd().equals(user.getConfirmPwd())){ throw new CommonException("确认密码与密码不相同,请确认!"); } //业务处理... return true; } }
最后自定义一个异常全局处理器,用于处理异常消息,如下:
@Slf4j @Configuration public class GlobalWebMvcConfig implements WebMvcConfigurer { /** * 统一异常处理 * @param resolvers */ @Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { resolvers.add(new HandlerExceptionResolver() { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) { log.error("【统一异常拦截】请求出现异常,内容如下:",e); ModelAndView mv = new ModelAndView(new MappingJackson2JsonView()); String uri = request.getRequestURI(); if(e instanceof CommonException){ //CommonExecption为自定义异常类抛出的异常 printWrite(((CommonException) e).getMsg(),((CommonException) e).getData(), uri, mv); } else if(e instanceof MethodArgumentNotValidException){ //MethodArgumentNotValidException为注解校验异常类 //获取注解校验异常信息 String error = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage(); printWrite(error,null, uri, mv); } else { printWrite(e.getMessage(),null, uri, mv); } return mv; } }); } /** * 异常封装相应结果 * @param object */ private void printWrite(String msg, Object object, String uri, ModelAndView mv){ ResResult resResult = new ResResult(uri, object); if(msg != null){resResult.setMsg(msg);} if(log.isDebugEnabled()){ log.debug("【response】异常输出结果:" + JSONObject.toJSONString(resResult, SerializerFeature.WriteMapNullValue)); } Map resultMap = BeanToMapUtil.beanToMap(resResult); mv.addAllObjects(resultMap); } }
下面我们启动项目,使用postman
来测试一把,看看效果如何?
- 测试字段是否为空
测试邮箱是否合法
测试密码长度是否符合要求
测试密码与确认密码是否相同