接收请求参数使用int类型的后果

产生场景:
  测试使用全局异常处理类@RestControllerAdvice与数据校验@Validated完成请求参数的数据校验
  
  全局异常处理类:
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value=com.swimming.basic.exception.NotNullException.class)

    @ExceptionHandler(value=javax.validation.ConstraintViolationException.class)
    public R NotNullHandler(ConstraintViolationException e) {
        Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
        Iterator<ConstraintViolation<?>> iterator = violations.iterator();
        StringBuffer message = new StringBuffer("");
        while (iterator.hasNext()) {
            message.append(iterator.next().getMessage());
        }
        return R.error().message(message.toString());
    }
  //...  
}

  Controller类

    @GetMapping("findById")
    public R findById(@NotNull(message = "id不能为空") int id){
        User user = userService.findById(id);
        return R.ok().data("user", user);
    }

  此时如果请求时没有携带参数:id,不会产生ConstraintViolationException异常,而是:

    java.lang.IllegalStateException: Optional int parameter 'id' is present but cannot be translated into a null value due to being declared as a primitive type
      id 为 int型数据,不能由一个null值转换
  
  解决:
    在springmvc接收请求参数时,尽量不要使用基本数据类型去接收(使用对应的包装类),否则会出现类似错误---此时使用@Validated是无法捕获的
posted @ 2021-06-16 17:14  樱花葬礼  阅读(395)  评论(0)    收藏  举报