springboot 参数检查使用

    技术2024-03-10  88

    springboot 项目中自带验证这一套的东西,不需要额外引入其他的jar首先创建一个项目写一个user 实体 和 controller,其中三个方法分别是单参数,和实体类型的 /** * *user 实体类型 */ @Data public class User { @NotBlank(groups = {Add.class},message = "111") private String name; @NotEmpty(groups = Editor.class,message = "222") private String addr; @Email @NotBlank private String email; }

    NotBlank 标识不能为空groups 指定新增的时候才进行检查,同时Add 继承了Default 所以@Emal 也会被检查,注意类上需要加上@Validated注解否则不会进行检查

    @Validated @RestController public class TestController { @Autowired private Messageutil messageutil; @Autowired private HttpServletRequest request; /** * 对单个属性进行检查 * @param name * @param addr * @return */ @PostMapping("/registerParams") public Map registerParams(@NotEmpty(message = "111") String name, @NotEmpty(message = "222") String addr){ System.out.println(request.getClass()); Map<String,Object> result = new HashMap(); result.put("data",messageutil.getLocaleMessage("111")); return result; } /** * 新增 * @param user * @return */ @PostMapping("/addUser") public Map addUser( @RequestBody User user){ Map<String,Object> result = new HashMap(); result.put("data",messageutil.getLocaleMessage("add.ok")); return result; } /** * 修改 * @param user * @return */ @PostMapping("/updateUser") public Map updateUser(@Validated(Editor.class) @RequestBody User user){ Map<String,Object> result = new HashMap(); result.put("data","修改成功"); return result; } } 接下来创建两个接口,Add表示新增接口,Editor表示编辑接口,继承了Default接口,这样不在分组中的检查就会被默认执行 import javax.validation.groups.Default; /** * 新增分组,继承默认的分组 */ public interface Add extends Default { } import javax.validation.groups.Default; /** * 编辑分组继承默认的分组 * 使默认的检查注解也会生效 */ public interface Editor extends Default { }

    将创建一个验证的配置类,采用快速失败模式

    /** * 快速失败模式: 当有一个条件不符合时直接返回 */ @Configuration public class ValidatorConfiguration { @Bean public Validator validator(){ ValidatorFactory validatorFactory = Validation .byProvider( HibernateValidator.class ) .configure() .failFast( true )//快速失败配置 .buildValidatorFactory(); return validatorFactory.getValidator(); } }

    创建一个全局异常处理类,处理异常并且返回提示信息

    /** * *测试类 */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @Autowired private Messageutil messageutil; @ExceptionHandler(BindException.class) public ResponseEntity handle( BindException e){ String key = e.getBindingResult().getAllErrors().get(0).getDefaultMessage(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(messageutil.getLocaleMessage(key,null,null)); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handle1( MethodArgumentNotValidException e){ String key = e.getBindingResult().getAllErrors().get(0).getDefaultMessage(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(messageutil.getLocaleMessage(key,null,null)); } @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity handle2(ConstraintViolationException e){ String key = e.getConstraintViolations().iterator().next().getMessage(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(messageutil.getLocaleMessage(key,null,null)); } }

    接下来就可以优雅的进行参数检查了

    非实体参数检查

    实体参数检查测试 因为user实体中,我们标记了name 在新增的时候才会检查 addr 在编辑的时候才会检查,email 为默认的都会检查 git地址:https://github.com/snail10000/i18n_study.git 代码中还包含了国际化的使用,感兴趣的小伙伴可以研究一下 springboot国际化实践文章

    Processed: 0.021, SQL: 9