#独家
spring boot中入参校验的疑问?

2023-08-06 0 1,000

1.spring boot 版本: v2.7.14-SNAPSHOT

  1. @RestController
  2. maven: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>

问题描述:
我的接口有get和post两个类型, 其中post使用的是如下:

postApiMethod(@RequestBody @Valid TopicCreateDto topicCreateDto)

然后在dto中写类似 @NotNull 的注解是生效的(我捕获了MethodArgumentNotValidException异常), 生成的结果类似:

校验失败:parentId:不能为null, 

但是我的GET接口我做了如下工作:

  1. controller类上面 添加 @Validated
  2. postApiGet(@RequestParam Long feedId)

不符合我预期的结果:

Required request parameter 'feedId' for method parameter type Long is not present

我想要的结果是:

校验失败:feedId:不能为null,

其他尝试:

postApiGet(@RequestParam @NotNull Long feedId),也提示为不符合预期的结果

所以我该如何让检验结果统一成这样的结果格式(xxx不能为null类似)呢?

把GET请求的参数封装成一个对象,然后在这个对象的类上加JSR-303注解进行校验就行:

@GetMapping("/api")
public String apiGet(@Valid ApiGetRequest request) {
    // ...
}

public class ApiGetRequest {
    @NotNull
    private Long feedId;

    // getters and setters
}

然后再自定义一个全局的异常处理器:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MissingServletRequestParameterException.class)
    @ResponseBody
    public String handleMissingParams(MissingServletRequestParameterException ex) {
        String name = ex.getParameterName();
        // 格式化返回的错误信息
        return "校验失败:" + name + ":不能为null";
    }
}
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. JK下载官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. JK下载官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. JK开发团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

JK软件下载官网 技术分享 spring boot中入参校验的疑问? https://www.jkxiazai.com/2408.html

JK软件应用商店是经过官方安全认证,保障正版软件平台

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务