Valid验证、 异常统一拦截、JackSon手动返回json数据

  1. Valid验证
    1.1 Valid基本验证
    原来的判断更多的是通过程序员编写逻辑代码完成验证,现在可以通过注解方式完成,我们首先需要加入新的maven驱动:
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>2.0.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>6.2.0.Final</version>
</dependency>

注意:第一个驱动是java自身的验证规则,第二个驱动是hibernate提供的一种验证方式,如果只用java自身的验证规则,则不需要引入第二个驱动,后续我们会看到两种驱动所带来的不同的注解式验证。

接下来,我们来做一个最基本的演示,例如:

@GetMapping("/test")
@ResponseBody
public String test(@Valid User user) {
    System.out.println("user=" + user);
    return "Hello World!";
}

这里,我们可以在接收的vo对象前,加入@Valid验证,在vo对象属性头上添加对应的注解完成验证操作,例如:

public class User {
    @Min(value = 1, message = "主键id必须大于0")
    private int id;
    @NotBlank(message = "姓名不能为空")
    @Size(min = 6, max = 10, message = "size 姓名必须在6~10位之间")
    private String username;
    ......
}

接着,我们通过get请求,只传递username:
http://localhost:8080/check?username=thinknovo
那么我们在页面上讲看到下面的错误信息:
在这里插入图片描述

如果我们希望返回的json错误信息,那么需要手动创建一个ExceptionHandler,例如:

@ExceptionHandler
@ResponseBody
public Map<String, Object> check(Exception e) {
    e.printStackTrace();
    Map<String, Object> map = new HashMap<>();
    map.put("code", 500);
    map.put("msg", e.getMessage());
    return map;
}

最后,我们能看到页面返回的json数据:
{“msg”:“org.springframework.validation.BeanPropertyBindingResult: 1 errors\nField error in object ‘user’ on field ‘id’: rejected value [0]; codes [Min.user.id,Min.id,Min.int,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.id,id]; arguments []; default message [id],1]; default message [主键id必须大于0]”,“code”:500}

1.2 常用注解说明(包括Java自身和Hibernate验证注解):
@Null
限制前端传递数据只能为null

@NotNull
限制前端传递数据必须不为null

@AssertFalse
限制前端传递数据必须为false

@AssertTrue
限制前端传递数据必须为true

@DecimalMax(value)
限制前端传递数据必须为一个不大于指定值的数字

@DecimalMin(value)
限制前端传递数据必须为一个不小于指定值的数字

@Digits(integer,fraction)
限制前端传递数据必须为一个小数(检查小数点),且整数部分的位数不能超过integer,小数部分的位数不能超过fraction

@Future
限制前端传递数据必须是一个将来的日期

@Max(value)
限制前端传递数据必须为一个不大于指定值的数字

@Min(value)
限制前端传递数据必须为一个不小于指定值的数字

@Past
限制前端传递数据必须是一个过去的日期

@Pattern(value)
限制前端传递数据必须符合指定的正则表达式

@Size(max,min)
限制前端传递数据字符长度必须在min到max之间

@Past
验证前端传递数据(日期类型)比当前时间早

@NotEmpty
验证前端传递数据不为null且不为空(字符串长度不为0、集合大小不为0)

@NotBlank
验证前端传递数据不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格

@Email
验证前端传递数据是Email,也可以通过正则表达式和flag指定自定义的email格式

  1. 异常统一拦截
@ControllerAdvice
@ResponseBody
public class ExceptionControllerAdvice {
    @ExceptionHandler
    @ResponseBody
    public Map<String, Object> check(Throwable e) {
        e.printStackTrace();
        Map<String, Object> map = new HashMap<>();
        map.put("code", 500);
        map.put("msg", e.getMessage());
        return map;
    }
}

定义一个异常拦截类,和SpringMVC一样,然后把异常的message信息直接封装在msg字段中,这样当抛出错误,就会返回一个错误信息的json数据,例如:
在这里插入图片描述

  1. JackSon手动返回json数据
    在某些情况下,我们需要手动创建一个json对象返回,而不能完全依赖SpringMVC自动返回,这时候,我们可以手动编写JackSon的json转换:
Map<String, Object> map = new HashMap<>();
map.put("code", 500);
map.put("msg", "用户未登录,无法使用此功能");
ObjectMapper objectMapper = new ObjectMapper();
String jsonStr = objectMapper.writeValueAsString(map);

如果需要把一个jsonStr手动转换成一个java类对象,可以通过下面的方式完成:

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(jsonStr, User.class);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值