简单实现springboot自定义注解校验参数并捕获异常返回消息

简单实现springboot自定义注解校验参数并捕获异常返回消息

  • 创建一个简单的springboot项目,pom依赖只导这些
    <parent>
        <!--限定版本-->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
  • 创建自定义注解CustomValidation
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomValidation {
    String message() default "Invalid parameter";
}
  • 编写一个参数校验器,实现HandlerMethodArgumentResolver接口,在校验器中完成参数校验
  • 校验逻辑中可以根据需求自行小小修改,例如 value.equals(“tom”)
public class CustomValidationResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterAnnotation(CustomValidation.class) != null;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // 获取参数值
        Object value = webRequest.getParameter(parameter.getParameterName());

        // 校验逻辑
        if (value == null) {
            throw new IllegalArgumentException("参数为null: " + parameter.getParameterName());
        }

        return value;
    }
}
  • 创建一个controller,调用test2,test的参数加自定义注解@CustomValidation
@RestController
@RequestMapping("hello")
public class HelloWorldController {
    @RequestMapping("test1")
    public String test1(){
        System.out.println("helle,this is test1!");
        return "hello,world!test1 success......";
    }
    @RequestMapping("test2")
    public String test2(@CustomValidation String name){
        System.out.println("helle,this is test2!   "+name);
        return "hello,world!test2 success......";
    }
}
  • 参数已经校验住了,异常信息如下
java.lang.IllegalArgumentException: 参数为null: name
	at org.example.CustomValidationResolver.resolveArgument(CustomValidationResolver.java:23) ~[classes/:na]
  • 请求的返回值
{
	"timestamp": "2023-11-18T12:58:52.123+00:00",
	"status": 500,
	"error": "Internal Server Error",
	"path": "/hello/test2"
}
  • 但是这样是返回对于前端不太友好,使用自定义异常捕获类优化一下这个小需求
  • 创建自定义异常类MyException
@Data
public class MyException extends RuntimeException {
    private int code;
    public MyException(int code, String message) {
        super(message);
        this.code = code;
    }
}
  • 创建返回结果的实体类ResultEntity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResultEntity {
    private String error;
    private String message;
}
  • 创建自定义异常捕获类CustomExceptionHandler
@ControllerAdvice
public class CustomExceptionHandler {
    // 异常处理方法
    @ExceptionHandler(MyException.class)
    public ResponseEntity<ResultEntity> handleValidationException(MyException ex) {
        // 从校验异常中获取错误信息
        String errorMessage = ex.getMessage();

        // 构造自定义的错误消息格式
        ResultEntity error = new ResultEntity("Validation Error", errorMessage);
        // 返回带有自定义错误消息的响应
        return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
    }
}
  • 重新调用test2,返回结果为
{
	"error": "Validation Error",
	"message": "参数为null: name"
}
  • 以上就是简单实现,可以试着类CustomValidationResolver中的resolveArgument里面的value进行判断,如果是字符串就不为空串,如果是int>0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值