Статьи

Проверка метода с помощью Spring 3.1 и Hibernate Validator 4.2

JSR 303 и Hibernate Validator были отличным дополнением к экосистеме Java, предоставляя вам стандартный способ проверки вашей доменной модели на всех уровнях приложения. В сочетании с аннотациями Java Persistence API (JPA) в вашем распоряжении есть несколько очень полезных инструментов, обеспечивающих поступление в вашу базу данных только достоверных данных.

Тем не менее, одним из недостатков функциональности была также возможность проверки вызовов методов. Например, не было бы неплохо, если бы вы могли использовать обычные аннотации JSR 303 для защиты вызовов бизнес-уровня?

Конечно, вы можете применять ограничения программно, например, предотвращать передачу параметров Null. Например, Spring предоставляет класс  org.springframework.util.Assert . Однако было бы желательно, чтобы ограничения, накладываемые на входные параметры, а также на возвращаемые значения, были частью контракта метода.

Войдите в Hibernate Validator 4.2, который был выпущен в июне 2011 года. Теперь он обеспечивает проверку метода, и Гуннар Морлинг, один из коммиттеров, имеет отличную статью об этом в своем блоге по адресу:

Кроме того, ознакомьтесь с документацией валидатора Hibernate  относительно валидации методов. Gunnar Morling также предоставляет некоторую предварительную поддержку Spring, доступную на GitHub:

Но новости для поклонников Spring становятся еще лучше — прямая поддержка валидации методов с помощью Hibernate Validator теперь доступна в последнем выпуске Spring 3.1, выпущенном GA всего две недели назад.

В частности, Spring 3.1 обеспечивает следующую поддержку в отношении проверки метода:

Для начала убедитесь, что вы используете Spring 3.1.0.RELEASE и что у вас есть Hibernate Validator 4.2 в вашем пути к классам. Это все, что вам нужно, чтобы начать использовать аннотации JSR 303 на уровне метода. Например, теперь вы можете аннотировать ваши методы, используя, например:

@Validated
public interface BusinessService {
    @NotNull String convertToUpperCase(@NotEmpty String input);
}

@Validated Аннотация указывает на то, что методы в классе должны быть включены для проверки метода. Помните, что вы можете указать собственную аннотацию, которая будет включать проверку уровня метода для аннотированного класса. Укажите свою собственную аннотацию, вызвав  setValidatedAnnotationType для MethodValidationPostProcessor .

Однако размещение самих аннотаций не будет приводить к ограничениям «автоматически». Фактически Spring будет использовать советы AOP (Aspect-Oriented Programming) под прикрытием, которые делегируются Hibernate Validator. Самый простой способ включить эти советы — объявить  bean- компонент MethodValidationPostProcessor в контексте приложения Spring, как показано ниже.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

 <context:component-scan base-package="com.hillert.spring.validation" />

    <bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

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

</beans>

Для более подробной информации я опубликовал небольшой проект на GitHub, который иллюстрирует валидацию на уровне метода с использованием Hibernate Validator:

Для того, чтобы начать:

  1. Клонируйте репозиторий с помощью  $ git clone git: //github.com/ghillert/spring-hibernate-validator-sample.git 
  2. $ cd spring-hibernate-validator-sample
  3. Постройте образец, используя чистый пакет Maven  $ mvn
  4. Run it with $ mvn exec:java

The command-line based sample provides a simple String conversion service, that converts Strings to upper-case. You can insert those Strings from the command line. The Service layer will enforce the following constraints using method level Hibernate Validator annotations:

  • The input String must not be empty (not null and not an empty String)
  • The conversion service will never return null

In order to trigger validation exceptions you can enter some special strings:

  • Pressing just enter (no string entered) will cause an empty String parameter to be set
  • Submitting «null» (The String), will cause a null parameter to be set
  • When entering «returnnull», the underlying business method will return Null

The Main method will catch the occurring MethodConstraintViolationExceptions and print some details to the command prompt.

Lastly, the current method validator support via Spring is specifically targetting Hibernate Validator. However, there are standardization efforts underway as part of the Bean Validation 1.1 specification (JSR-349). In order to follow the progress, please follow also http://beanvalidation.org/.

Spring will provide support for JSR-349 as soon as the official standard has been ratified. In order to track inclusion into the Spring framework, please follow also Spring Framework Jira ticket SPR-8199 . As of today this feature should be available in the next Spring 3.2 release.

I hope this blog entry and the accompanying sample have showed you how easy it is to get started with  method level validation using Spring and Hibernate Validator. Please let me know if you have further questions or run into issues.

From http://hillert.blogspot.com/2011/12/method-validation-with-hibernate.html