2012-02-28 9 views
5

¿Es posible hacer un uso efectivo de las anotaciones JSR303 (validación de frijoles) en los recursos de JAX-RS?Validación de recursos de JAX-RS (Apache Wink) con JSR303?

Entonces, por ejemplo, si tengo un miembro del recurso que he anotado @NotEmpty, ¿generar un error de nuevo al cliente si esta restricción no se cumple?

Esto parece como la cosa obvia a hacer, pero también feliz que se les diga mejores formas (no me quiero mover la validación hasta el nivel ORM/base de datos)

Respuesta

3

¿Realmente significa validar el recurso miembros? Por lo general, los miembros del recurso se inyectan de esta forma u otra (ya sea contextos o entidad, o parámetros de ruta/consulta/matriz), siempre que el marco JAX-RS funcione, conseguirá que estos miembros sean correctamente inyectados.

Personalmente, creo que tiene más sentido validar la entidad ya que ha llegado por cable, rellenada por un MessageBodyReader y básicamente no tienes idea de lo que hay adentro, ¿no?

Así que si decide validar las entidades, hay varios enfoques que se pueden tomar:

  1. yo sepa, Apache Wink no soporta validaciones incorporadas. Puede implementar un controlador. Ver DeploymentConfiguration.initRequestHandlersChain(). Es compatible con la adición de controladores de usuario. En su controlador puede realizar cualquier validación. Incluso creo que la comunidad Wink se alegrará si contribuyes con este código.
    El único problema con este enfoque, está relacionado con el Apache Wink. No funcionará si decide pasar a un marco JAX-RS diferente.

  2. Otro enfoque es realizar esta validación en su propio MessageBodyReader. Todo lo que necesita hacer es registrar un lector especial para sus entidades y validar la entidad que contiene. Todavía puede aprovechar los lectores de cuerpo de mensaje estándar (como JAXB o Jackson) utilizando @Context Providers.getMessageBodyReader(). La buena parte de este enfoque es que es JAX-RS estándar. Lo malo es que uses MessageBodyReaders para algo para lo que no fueron diseñados.

  3. El enfoque más simple es validar la entidad en la primera línea de cada método de recurso. Creará algo de duplicación de código, pero a veces la simplicidad gana.

1

Una solución - como yo estoy usando 2.5.x primavera, puedo crear una clase contenedora que implementa InitializingBean y los delegados al validador de Hibernate. Funciona, ¿hay una mejor solución?

+0

Actualización - Creo que esto corresponde a la respuesta # 3 de Tarlog. – Brabster

+0

En realidad, pensé en ponerlo en el 4 ° artículo, pero luego decidí dejarlo. El problema con este enfoque es que la clase contenedora puede no tener las anotaciones de la clase de recursos. Realmente depende de cómo lo implemente. – Tarlog

Cuestiones relacionadas