2013-02-12 7 views
1

Как использовать параметры метода проверки JSR-303 и исключать исключение, если параметр недействителен?JSR 303. Validate method parameter and throw exception

Например, например: public void createUser(@ValidOrThrowException User user) {...}?

На данный момент, я проверяю каждый параметр метода в теле метода, как

public void createUser(User user) { 
    ConstraintViolations violations = Validator.validate(user); 
    if (!violations.isEmpty()) { 
     throw new IllegalArgumentException(createExceptionMessage(violations)); 
    } 
    ...//business logic 
} 

, и я думаю, что это некрасиво.

P.S. В качестве эталонной реализации я использую Hibernate-validator 4.1.0.Final

ответ

2

Если вы можете перейти на Hibernate Validator 4.2.0 или выше, вы можете использовать его method validation feature, который обеспечивает поддержку проверки параметров метода и возвращаемых значений.

Механизм проверки подлинности может быть вызван автоматически при вызове ограниченных методов с использованием таких динамических прокси, АОП, перехватчиков и т. Д. В зависимости от структуры, с которой вы работаете, вы можете, например, используйте одно из следующих действий:

  • При работе с Spring 3.1 или более поздней версией: MethodValidationInterceptor
  • При работе с КДИ: Seam Validation (оговоркой: Я автор этого)
  • При работе с Guice: Я «ве добавили example for this на GitHub

Обратите внимание, что по состоянию на Bean Validation 1.1 (будет завершена в ближайшее время) и его эталонной реализации Hibernate Validator 5, валидация метода будет частью стандартизированной Bean Validation API.

+0

Спасибо. Таким образом, это означает, что параметр, аннотированный аннотацией @ @ Valid, сам не вызывает исключение, если объект недействителен? И мне нужно вручную создать аспект (AOP), с '@ pointcut', указывающим на все аннотации @ @ Valid в параметрах методов? И когда такая аннотация найдена, мне нужно создать экземпляр «Validator» и вручную проверить значение параметра метода, аннотированное с помощью '@ Valid'? – MyTitle

+0

У вас нет примера с AspectJ? – MyTitle

+0

У меня, к сожалению, нет примера, в котором используется AspectJ. Но общий подход должен быть таким же, как в примерах проектов на GitHub: перехватить вызов, проверить параметры, продолжить вызов, проверить возвращаемое значение, вывести «ConstraintViolationException», если сбой одного из шагов проверки. – Gunnar

 Смежные вопросы

  • Нет связанных вопросов^_^