实现对当前服务中所有post请求中已经带@Requestbody注解的任意请求对象中的其中一个同名参数进行统一校验
时间: 2024-04-15 07:31:21 浏览: 92
要实现对当前服务中所有已经带有 `@RequestBody` 注解的 POST 请求中的请求对象中的某个同名参数进行统一校验,可以使用 Spring 框架提供的校验功能结合 AOP(面向切面编程)的方式实现。
首先,创建一个自定义的注解,例如 `@CustomValidation`,用于标记需要进行统一校验的参数。在需要进行校验的参数上添加该注解:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface CustomValidation {
}
```
接下来,创建一个切面类,用于拦截带有 `@RequestBody` 注解的 POST 请求,并进行统一校验。在切面类中,使用 `@Before` 注解标记一个方法,在该方法中实现校验逻辑:
```java
@Aspect
@Component
public class RequestBodyValidationAspect {
@Autowired
private Validator validator;
@Before("@annotation(org.springframework.web.bind.annotation.PostMapping) && args(.., @RequestBody requestBody)")
public void validateRequestBody(JoinPoint joinPoint, Object requestBody) throws Throwable {
Field[] fields = requestBody.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(CustomValidation.class)) {
field.setAccessible(true);
Object value = field.get(requestBody);
Set<ConstraintViolation<Object>> violations = validator.validate(value);
if (!violations.isEmpty()) {
throw new IllegalArgumentException(violations.iterator().next().getMessage());
}
}
}
}
}
```
在上述代码中,切面类 `RequestBodyValidationAspect` 使用了 `@Aspect` 和 `@Component` 注解,表示它是一个切面,并且可以被 Spring 容器扫描到。
在 `validateRequestBody` 方法中,通过 `@Before` 注解指定了切入点,即拦截所有带有 `@PostMapping` 注解的方法,并且方法参数中带有 `@RequestBody` 注解的参数。然后,对请求对象中的字段进行遍历,如果字段被标记为 `@CustomValidation` 注解,则获取字段的值并使用 `Validator` 对其进行校验。
最后,可以在你的请求对象参数中,为需要进行校验的参数添加 `@CustomValidation` 注解,例如:
```java
public class MyRequest {
@CustomValidation
private String param;
// getter and setter
}
```
这样,在所有带有 `@RequestBody` 注解的 POST 请求中,只有带有 `@CustomValidation` 注解的参数会进行统一校验。如果校验失败,将抛出异常并返回相应的错误信息。
阅读全文