Проверка параметров метода с помощью JSR-303
Является ли JSR-303 также предназначенным для проверки параметров метода?
Если да, есть ли какой-нибудь пример в Интернете? Самая большая проблема, с которой я сталкиваюсь, заключается в том, как получить валидатор в каждом методе. С Spring 3, не означает ли это, что мне придется вводить практически каждый класс с помощью LocalValidatorFactoryBean
?
Спасибо!
Ответы
Ответ 1
Это звучит как прецедент для AOP (AspectJ). Напишите pointcut для методов, аннотированных с помощью javax.validation.constraints.*
, вставьте валидатор в аспект (возможно, используя Spring) и используйте рекомендации @Before
или @Around
для выполнения проверки перед выполнением метода.
Прочтите AspectJ в действии для справки.
Ответ 2
Проверка уровня метода будет поддерживаться в следующей версии 4.2 справочной реализации JSR 303 Hibernate Validator.
Как указано в предыдущем ответе, это позволит указывать аннотации ограничений (как встроенные, так и настраиваемые типы) в параметрах метода и возвращать значения, чтобы указать предварительные и пост-условия для вызова метода.
Обратите внимание, что HV будет иметь дело только с фактической проверкой вызовов методов не с инициированием такой проверки. Вызов проверки может быть выполнен с использованием AOP или других объектов перехвата методов, таких как динамические прокси-серверы JDK.
Проблема JIRA для этого - HV-347 [1], поэтому вы можете добавить себя в качестве наблюдателя к этой проблеме.
[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347
Ответ 3
javadocs для каждой из аннотаций JSR 303 сообщает следующее:
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
Смотрите, PARAMETER
есть. Итак, да, это технически возможно.
Вот пример:
public void method(@NotNull String parameter) {
// ...
}
Я не уверен, как это интегрируется с Spring, так как я его не использую. Вы можете просто попробовать.
Ответ 4
В Spring 3.1.0 вы можете использовать аннотацию @Validated для активации проверки на pojo.
Создайте интерфейс для класса pojo, поместите над ним аннотацию, затем добавьте аннотации проверки в определениях методов. (требуется интерфейс, потому что Spring создаст прокси-класс, используя интерфейс как определение)
@Validated
public interface PojoClass {
public @NotNull String doSomething(@NotEmpty String input);
}
ваше pojo:
public class PojoClassImpl implements PojoClass {
public String doSomething(String input) {
return "";
}
}
Начиная с стандартного веб-приложения Spring с активной проверкой, не забудьте добавить в конфигурацию Spring это объявление bean:
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
Ответ 5
Вы можете использовать jcabi-аспекты (я разработчик), который объединяет JSR 303 с AspectJ. Фактическая проверка выполняется с помощью одной из реализаций JSR 303, которую вам нужно будет добавить в путь класса, например, Hibernate Validator или Apache BVal.