Проверка параметров метода с помощью JSR-303 - PullRequest
10 голосов
/ 13 декабря 2010

JSR-303 также предназначен для проверки параметров метода?

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

Спасибо!

Ответы [ 5 ]

9 голосов
/ 10 января 2011

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

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

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

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

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

3 голосов
/ 16 мая 2013

В 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"/>
3 голосов
/ 13 декабря 2010

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

3 голосов
/ 13 декабря 2010

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

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

Видите, PARAMETER есть.Так что да, технически возможно .

Вот пример:

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

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

0 голосов
/ 15 марта 2013

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

...