2010-12-12 1 views
10

Является ли JSR-303 также предназначенным для проверки параметров метода?Проверка параметров метода с помощью JSR-303

Если да, то есть ли какой-либо пример в Интернете? Самая большая проблема, с которой я сталкиваюсь, заключается в том, как получить валидатор в каждом методе. С весной 3, разве это не означает, что мне придется вводить практически каждый класс с LocalValidatorFactoryBean?

Спасибо!

ответ

3

Это звучит как прецедент для АОП (AspectJ). Напишите pointcut для методов, которые аннотируются с помощью javax.validation.constraints.*, вставьте валидатор в аспект (возможно, используя Spring) и используйте команду @Before или @Around, чтобы выполнить проверку перед выполнением метода.

Прочитано AspectJ in Action для справки.

3

javadocs для каждого из JSR 303 аннотации говорит следующее:

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 

See, PARAMETER есть. Итак, да, это технически возможно.

Вот пример:

public void method(@NotNull String parameter) { 
    // ... 
} 

Я, однако, не уверен, как это интегрируется с Spring, так как я не использую его. Вы могли бы просто попробовать.

9

Подтверждение уровня метода будет поддерживаться в следующей версии 4.2 ссылочной реализации JSR 303 Hibernate Validator.

Как указано в предыдущем ответе, это позволит указывать аннотации ограничений (как встроенные, так и настраиваемые типы) в параметрах метода и возвращаемых значениях для указания предварительных и пост-условий для вызова метода.

Обратите внимание, что HV будет иметь дело только с фактической проверкой вызовов методов не с инициированием такой проверки. Вызов проверки может быть выполнен с использованием AOP или других методов перехвата методов, таких как динамические прокси-серверы JDK.

Проблема JIRA для этого - HV-347 [1], поэтому вы можете добавить себя в качестве наблюдателя к этой проблеме.

[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347

+0

Я думаю, что ваш блог дополняет свой ответ;) http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-h ibernate.html – Maxym

+0

Gunnar был достаточно хорош, чтобы поместить его решение в [GitHub] (https://github.com/gunnarmorling/methodvalidation-integration). Отлично работает для меня. – Patrick

0

Вы можете использовать jcabi-aspects (я разработчик), который объединяет в единое JSR 303 с AspectJ. Фактическая проверка выполняется с помощью одной из реализаций JSR 303, которую вам нужно будет добавить в путь класса, например, Hibernate Validator или Apache BVal.

2

Весной 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 ""; 
    } 
} 

Начиная от стандартной пружины веб-приложения с активной проверки, не забудьте добавить в конфигурация весной этот компонент декларации:

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 
+0

По какой-то странной причине ConstraintViolationException public \ @NotNull String doSomething(); не работает, но \ @NotNull public String doSomething(); сделал. Использовал бар, чтобы избежать символа At, который был нарушен пользователем S.O – borjab