Вы можете использовать @Valid в сочетании с @RequestBody для проверки всех полей, помеченных javax.validation.constraints аннотациями (@NotBlank, @NotNull и др. c). подробнее здесь
Для @RequestParam и @PathVariable существует аналогичный подход здесь
Я рекомендую использовать эти подходы перед тем, как перейти к Совет контроллера.
Редактировать : после ваших разъяснений.
Не уверен насчет пользовательского Spring Validator, но использование AOP и отражения возможно. Я реализовал пример ниже, надеюсь, это поможет.
@Component
@Aspect
public class ControllerAdvice {
private static final Logger logger =
LoggerFactory.getLogger(ControllerAdvice.class);
@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
public void controller() {
}
@Before("controller()")
public void beforeRestAPI(JoinPoint jp) {
Object[] args = jp.getArgs();
MethodSignature signature = (MethodSignature) jp.getSignature();
Annotation[][] annotations = signature.getMethod().getParameterAnnotations();
for (int i = 0; i < args.length; i++) {
// validate @RequestParam arguments
if (args[i] instanceof String && annotations[i].length > 0
&& annotations[i][0].annotationType().equals(RequestParam.class)) {
String s = (String) args[i];
logger.info("validating RequestParam " + s);
}
// validate String fields of @RequestBody
if (annotations[i].length > 0
&& annotations[i][0].annotationType().equals(RequestBody.class)) {
Field[] allFields = args[i].getClass().getDeclaredFields();
for (Field f : allFields) {
// skip fields with specific annotation
if(f.isAnnotationPresent(SkipValidation.class)) {
continue;
}
if (f.getType().equals(String.class)) {
logger.info("validating string field: " + f.getName());
}
}
}
}
}
}