spring boot接口参数校验统一处理方案
本文探讨Spring Boot 2.7.14版本中GET和POST请求参数校验的差异,以及如何统一校验结果格式。 许多开发者在使用@RequestBody @Valid校验POST请求体时能够成功捕获MethodArgumentNotValidException,但GET请求使用@RequestParam @NotNull或@Validated注解却常常抛出MissingServletRequestParameterException,而非预期的校验失败信息。
这是因为@RequestParam本身不支持JSR-303校验注解(如@NotNull),它只负责将请求参数映射到方法参数。@Validated注解作用于方法参数对象,而单个long feedId并非对象。
为了解决这个问题并统一校验结果格式,我们采用以下方法:
首先,将GET请求参数封装到DTO对象中:
@GetMapping("/api")public String apiGet(@Valid ApiGetRequest request) { // ...}public class ApiGetRequest { @NotNull private Long feedId; // getters and setters}
创建ApiGetRequest类,将feedId作为属性并添加@NotNull注解,利用Spring的校验机制进行非空校验。
Get笔记
Get笔记,一款AI驱动的知识管理产品
125 查看详情
其次,自定义全局异常处理器,统一处理校验异常:
@ControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler({MethodArgumentNotValidException.class, MissingServletRequestParameterException.class}) @ResponseBody public ResponseEntity handleValidationExceptions(Exception ex) { String errorMessage; if (ex instanceof MethodArgumentNotValidException) { MethodArgumentNotValidException e = (MethodArgumentNotValidException) ex; errorMessage = e.getBindingResult().getFieldError().getDefaultMessage(); } else if (ex instanceof MissingServletRequestParameterException) { MissingServletRequestParameterException e = (MissingServletRequestParameterException) ex; errorMessage = "校验失败:" + e.getParameterName() + ":不能为null"; } else { errorMessage = "未知错误"; } return ResponseEntity.badRequest().body(errorMessage); }}
此全局异常处理器捕获MethodArgumentNotValidException和MissingServletRequestParameterException,并构建统一格式的错误信息。 使用ResponseEntity返回更规范的HTTP响应,包含状态码。

通过此方案,无论POST请求的MethodArgumentNotValidException还是GET请求的MissingServletRequestParameterException,都能被统一处理,返回一致的错误信息格式,从而满足了开发者对校验结果格式的要求。 这提升了代码的可维护性和可读性。
以上就是Spring Boot中GET和POST请求参数校验如何统一处理?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/357360.html
微信扫一扫
支付宝扫一扫