简单实现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>
@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;
}
}
@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 ) ;
}
}
{
"error" : "Validation Error" ,
"message" : "参数为null: name"
}
以上就是简单实现,可以试着类CustomValidationResolver
中的resolveArgument
里面的value进行判断,如果是字符串就不为空串,如果是int>0