实现对当前服务中所有post请求中加上@Requestbody注解的任意请求对象参数中的其中一个同名参数进行统一校验
时间: 2024-04-15 07:30:55 浏览: 153
要实现对当前服务中所有带有 `@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 {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
Parameter[] parameters = method.getParameters();
for (int i = 0; i < parameters.length; i++) {
if (parameters[i].isAnnotationPresent(CustomValidation.class)) {
Object value = getValueOfParameter(requestBody, parameters[i].getName());
Set<ConstraintViolation<Object>> violations = validator.validate(value);
if (!violations.isEmpty()) {
throw new IllegalArgumentException(violations.iterator().next().getMessage());
}
}
}
}
private Object getValueOfParameter(Object requestBody, String parameterName) throws NoSuchFieldException, IllegalAccessException {
Field field = requestBody.getClass().getDeclaredField(parameterName);
field.setAccessible(true);
return field.get(requestBody);
}
}
```
在上述代码中,切面类 `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` 注解的参数会进行统一校验。如果校验失败,将抛出异常并返回相应的错误信息。
阅读全文