Реализация проверки Java Bean с аннотациями в пакетном приложении Spring

#java #spring #validation #spring-batch

#java #весна #валидация #весенний замес

Вопрос:

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

То, что я думал, что смогу, это добавить аннотацию к параметру метода, и если этот параметр не будет проверен, метод никогда не будет вызван. Но это работает не так. Очевидно, я все равно должен сначала позвонить Validator.validate() . Я прав?

Это пример моего компонента с пользовательской аннотацией:

 public void setValue(@NullOrDecimal String value) {
    // I don't want to come into this method if "value" isn't a null or a decimal
    if (StringUtils.isNotEmpty(value)) {
        this.value = new BigDecimal(value);
    }
}
 

Есть ли какой-нибудь способ сделать то, чего я пытаюсь достичь здесь?

Ответ №1:

Вы правы. Аннотация сама по себе ничего не делает. Вы должны вызвать некоторый код, который проанализирует эти аннотации и что-то сделает (проверка в вашем случае).

Проверка данных является типичным вариантом использования для обработчика элементов, поэтому Spring Batch предоставляет ValidatingItemProcessor . Вы всегда можете подключить другой процессор к цепочке a CompositeItemProcessor , если хотите выполнить некоторую обработку допустимых элементов (недопустимые элементы будут отклонены или отфильтрованы и не будут продолжены в цепочке).

Комментарии:

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

2. Возможно, я ошибаюсь, у меня с этим нет проблем. Однако я так не думаю. Если вы поделитесь своим полным кодом, я могу показать вам, где происходит проверка.

3. Спасибо за пример! Единственная проблема, с которой я сталкиваюсь, BeanValidatingItemProcessor заключается в том, что поля должны быть установлены в компоненте, а затем проверены. Я хотел перехватить значения до того, как они попадут в компонент.

4. Это не то, как работает API проверки компонентов. Идея этого API состоит в том, чтобы аннотировать классы с ограничениями проверки и вызывать процесс проверки для заполненных компонентов (с допустимыми или недопустимыми данными). Я не понимаю, как он мог бы проверять значения, прежде чем устанавливать их в полях. Кто будет вызывать код проверки в этом случае?

5. С аннотацией проверки на уровне параметров и MethodValidationPostProcessor . Я также должен был аннотировать свой компонент на уровне класса с @Validated помощью . Согласно статье, @Validated процесс проверки выполняется автоматически, по сравнению с программным вызовом validate() метода. Надеюсь, это имеет смысл? Если нет, я изложу суть своего кода.

Ответ №2:

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

Комментарии:

1. Для этого ваш POJO не обязательно должен быть компонентом, вот пример: github.com/spring-projects/spring-batch/blob /. … Если вы хотите применить ограничения проверки компонента к своему элементу, вы можете использовать BeanValidatingItemProcessor , ValidatingItemProcessor более общий.