Проверка параметров метода с помощью 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.