- 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国际化实践文章