2010-12-12 12 views
10

¿El JSR-303 también está destinado a la validación de parámetros de métodos?Validación del parámetro de método con JSR-303

Si es así, ¿hay algún ejemplo en la web? El mayor desafío que estoy enfrentando es cómo obtener un validador dentro de cada método. Con Spring 3, ¿no significa que tendría que inyectar virtualmente todas las clases con un LocalValidatorFactoryBean?

Gracias!

Respuesta

3

Esto suena como un caso de uso para AOP (AspectJ). Escriba un punto de corte para los métodos que están anotados con javax.validation.constraints.*, inserte un validador en el aspecto (probablemente utilizando Spring) y use un consejo @Before o @Around para realizar la validación antes de la ejecución del método.

Lea AspectJ in Action para referencia.

3

El javadocs para cada una de las anotaciones JSR 303 dice lo siguiente:

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

Sede, PARAMETER está allí. Entonces, sí, es técnicamente posible.

He aquí un ejemplo:

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

que sin embargo no estoy seguro de lo que se integra con la primavera ya que yo no lo uso. Podrías darle una oportunidad.

9

La validación del nivel de método se admitirá en la próxima versión 4.2 de la implementación de referencia de JSR 303 Hibernate Validator.

Como se señaló en la respuesta anterior, esto permitirá que las anotaciones de restricciones (integradas y tipos definidos personalizados) se especifiquen en los parámetros del método y devuelvan valores para especificar pre y post condiciones para la invocación de un método.

Tenga en cuenta que HV solo se ocupará de la validación real de las llamadas a métodos no con la activación de dicha validación. La invocación de validación podría realizarse utilizando AOP u otras facilidades de interceptación de métodos, como los proxies dinámicos de JDK.

El problema de JIRA para esto es HV-347 [1], por lo que es posible que desee sumarse como observador a este problema.

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

+0

creo que su blog complementa su respuesta;) http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-h ibernate.html – Maxym

+0

Gunnar fue lo suficientemente bueno para poner su solución en [GitHub] (https://github.com/gunnarmorling/methodvalidation-integration). Funcionó muy bien para mí – Patrick

0

Puede utilizar jcabi-aspects (soy un desarrollador), que integra JSR 303 con AspectJ. La validación real se realiza mediante una de las implementaciones JSR 303, que deberá agregar a la ruta de clase, como Hibernate Validator o Apache BVal.

2

En Spring 3.1.0 puede usar @Validated annotation para activar la validación en un pojo. Crea una interfaz para la clase pojo y pon esta anotación sobre ella, luego agrega tus anotaciones de validación en las definiciones de métodos.(La interfaz es necesario porque la primavera va a crear una clase de proxy utilizando la interfaz como definición)

@Validated 
public interface PojoClass { 
    public @NotNull String doSomething(@NotEmpty String input); 
} 

su POJO:

public class PojoClassImpl implements PojoClass { 
    public String doSomething(String input) { 
     return ""; 
    } 
} 

A partir de una aplicación de la primavera web estándar con la validación activo, recuerde agregar en la configuración de la primavera esta declaración de frijol:

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

Por algún extraño motivo ConstraintViolationException public \ @NotNull String doSomething(); no funcionó, pero \ @NotNull public String doSomething(); hizo. Usó la barra para escapar del símbolo At que estaba confuso con el usuario por S.O. – borjab

Cuestiones relacionadas