Проверьте все поля строк в RequestBody и Param - PullRequest
2 голосов
/ 03 марта 2020

Я использую службы отдыха на основе весенней загрузки и собираюсь применить проверку по умолчанию ко всем строкам.

  • Я хочу применить проверку по умолчанию к любому строковому полю, являющемуся частью @ RequestBody или @Param. Примечание. Мне нужна проверка по умолчанию, т. Е. Я хочу иметь возможность делать это без аннотирования всех строковых полей.
  • Я хочу иметь возможность аннотировать поле, чтобы пропустить проверку.
  • Я планирую чтобы реализовать это, используя рекомендации контроллера, чтобы все контроллеры получили эту проверку.

Я рассмотрел использование редакторов источника свойств, но это не похоже на то, что он предназначен для того, чтобы выдавать ошибки проверки. Я не уверен, что у меня будет доступ к примененным аннотациям к полю.

Используя реализацию Custom Spring Validator, я не уверен, как я могу обрабатывать вложенные поля в сложном объекте.

Я почти уверен, что я не единственный, кто ищет ответ на что-то подобное. Есть ли рекомендация?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вы можете использовать @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());
                }

            }
        }
    }

}
}
0 голосов
/ 07 марта 2020

На случай, если кому-то понадобится это в будущем.

Я узнал, что у Spring есть совет RequestBodyAdvice специально для тел запросов.

Я расширил RequestBodyAdviceAdapter Spring, который реализует RequestBodyAdvice и дает абстрактные методы beforeBodyRead и afterBodyRead.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/RequestBodyAdviceAdapter.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...