接收请求参数使用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是无法捕获的