#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
более общий.