1、@NotBlank 、 @NotEmpty 、 @NotNull 的简单区别
- @NotBlank 主要用于String 中判断空格
- @NotEmpty 主要用于集合
- @NotNull 就是不为空,在基本类型上面
2、表单提交部分,注解验证参数
问题的环境:验证提交的表单里面的数据
解决方法:
(1)、可以先给它创建一个验证这些表单字段的model对象(这里的话,叫做From)
(2)、然后From里面写上要验证的字段名称,并且加上@NotBlank注解(引入的是这个 import javax.validation.constraints.NotBlank;),把一些输入的空格给它去掉;同时,开头加上@Data注解
(3)、在Controller上面写上@Valid注解 和 BindingResult bindingResult (@Valid注解和bindingResult一起使用的)
(4)、getField和getDefultMessage写在return上面看看效果,不过这个时候,要先去写下ResponseVo里面的方法,第一个参数还是Enum,第二个参数的话,用的是String 类型的,然后的话,控制台那里用getXXX + " "+ getXXX给它拼接上一个字符串就可以了。
(5)、写在Controller里面也太乱了,有没有简洁一些的,比如把那么一长串的字符串放在ResponseVo里面,那么就有了如下图所示的图片了
更多的注解如下
public class Test {
@NotNull(message = "ID不能为空")
@Range(min = 1, max = 100, message = "ID必须在1到100之间")
private Integer id;
@NotBlank(message = "姓名不能为空")
@Length(min = 2, max = 6, message = "姓名必须在2到6位之间")
private String name;
@NotNull(message = "余额不能为空")
@DecimalMax(value = "30.50", message = "余额不能超过30.5")
@DecimalMin(value = "1.50", message = "余额不能低于1.5")
private BigDecimal amount;
@NotNull(message = "生日不能为空")
@Past(message = "生日必须是过去")
private Date birthday;
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
@NotBlank(message = "手机号不能为空")
@Pattern(regexp = "^(((13[0-9])|(14[579])|(15([0-3]|[5-9]))|(16[6])|(17[0135678])|(18[0-9])|(19[89]))\\d{8})$", message = "手机号格式错误")
private String phone;
}
然后在controller的每个接口中使用@Validated和BindingResult类
@Validated注解用于验证一个入参,验证之后的消息绑定到BindingResult类中
@PostMapping("/test")
@ApiOperation(value = "测试", notes = "", response = Result.class)
public Result test(@ApiParam(name = "test", value = "参数", required = true) @Validated @RequestBody Test test, BindingResult bindingResult) {
if(bindingResult.hasErrors()){
String errorMsg = bindingResult.getFieldError().getDefaultMessage();
return Result.error(errorMsg);
}
return Result.ok("参数验证通过");
}
3、处理异常
3.1 先模拟一个异常吧
private void error(){
throw new RuntimeException("意外错误");
}
然后把这个error()放在这个上面
运行后的结果当然是500啦,如下图所示
3.2 处理异常 @ControllerAdvice
(1)、先写一个包,叫做exception,然后再写个类吧,叫RuntimeExceptionHandler,这里的话,先给它加上注解 @ControllerAdvice ,
(2)、里面返回的还是ResponseVo,里面的话,return那个异常就可以
(3)、然后注解的话是@ExceptionHandler(RuntimeException.class)
(4)、返回的是JSON格式的,记得加上@ResponseBody
(5)、最后结果返回的是200
(6)、附加 假如要返回HTTP的某一个状态码应该怎么做(比如返回的是200,或者是500 。。。)
- 首先先写上@ResponseStatus(HttpStatus)
- 然后点击HttpStatus可以看到下面第一张图片,里面显示出了各种状态码
- 我们可以选各种各样的状态码,比如,我们选择405
- 那么在注解上,我们就写@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED),运行Postman,看看效果如何
如下图所示,已经成功的返回了405(我们预期的数字)
@ControllerAdvice
public class RunTimeExceptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseBody
//@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
public ResponseVo handle(RuntimeException e){
return ResponseVo.error(ResponseEnum.SERVICE_ERROR, e.getMessage());
}
}