java - servicio - rest api
Consejos prácticos sobre el uso de Jersey y Guice para el servicio RESTful (10)
Creo que no puedo usar la inyección de constructor con ningún recurso ya que Jersey quiere controlar esto
No puedes usar la inyección de constructor de Guice porque la creación del recurso es administrada por jersey. En este caso, puede utilizar la anotación @Inject
de @Inject
antes del parámetro de constructor que desea inyectar:
public NewsResource(@Inject NewsService service)
Según lo que puedo encontrar en línea, el estado del arte para la integración de Guice + Jersey se ha estancado desde 2008 cuando parece que ambos equipos llegaron a un callejón sin salida. El quid de la cuestión es que las anotaciones JAX-RS realizan la inyección de campo y método, y esto no funciona muy bien con la propia inyección de dependencia de Guice.
Algunos ejemplos que he encontrado no van lo suficientemente lejos como para dilucidar:
La publicación de Iqbalyusuf en Jersey + Guice en Google App Engine Java sufre de un montón de repeticiones (obtener y llamar manualmente al inyector). Quiero vinculantes y la inyección debe ocurrir detrás de las escenas a través de anotaciones Guice.
El artículo de Jonathan Curran Creación de un servicio RESTful con Jersey, Guice y JSR-250 me dio esperanza porque es mucho más actual (2010), pero no fue más que mostrar cómo iniciar un servicio de Jersey dentro de un Guice ServletModule. Sin embargo, no hay ejemplos de realizar ninguna inyección de dependencia real. Supongo que fue dejado como un ejercicio para el lector. La publicación de Curran puede ser, de hecho, el primer paso correcto para conectar Guice y Jersey, así que planeo comenzar con eso.
tentadoramente James Strachan escribe :
JAX-RS funciona bien con marcos de inyección de dependencia como Spring, Guice, GuiceyFruit o JBossMC; básicamente, puede elegir el que prefiera.
Pero no veo ninguna evidencia que sea verdadera desde el punto de vista de un practicante.
Lo que encuentro que falta son ejemplos prácticos y explicaciones sobre cómo combinar JAX-RS y las anotaciones de Guice. Por ejemplo:
- Creo que no puedo usar la inyección de constructor con ningún recurso ya que Jersey quiere controlar esto
- No estoy seguro si puedo combinar @Inject con @PathParam, @QueryParam, et al.
- Cómo usar la inyección en una implementación MessageBodyWriter
¿Alguien tiene ejemplos, preferiblemente con fuentes, de aplicaciones no triviales que combinan Jersey y Guice sin sacrificar uno u otro en el proceso? Sin embargo, sigo por este camino, pero las partes de las listas de Jersey y Guice me hacen pensar que estoy repitiendo el trabajo de otros que vinieron antes que yo.
Al principio estaba teniendo problemas similares al tratar de usar Guice para hacer la inyección de constructor en mis clases anotadas en Jersey, pero finalmente lo conseguí, aunque con una aplicación bastante trivial.
Seguí las instrucciones aquí: jersey-guice javadoc
El truco en mi caso era que necesitaba eliminar la configuración estándar de Jersey de mi web.xml (como Jersey ServletContainer) y mantener solo el detector Guice y el filtro Guice. Una vez que hice eso, Guice fue llamado para crear mi objeto anotado JAX-RS, y Jersey estaba inyectando mis métodos anotados JAX-RS (como @GET, etc.) como se esperaba.
Aunque el ejemplo de Sunny Gleason es genial, ahora está un poco desactualizado.
Entonces, después de haber luchado mucho tratando de hacer que Guice y Jersey jugaran bien entre ellos, creé el siguiente proyecto de muestra para que comiences:
https://github.com/MaliciousMustard/gradle-guice-jersey-jetty
Este proyecto está usando las siguientes tecnologías:
- Guice para DI
- Jersey para la API RESTful
- Jackson para mapeo POJO a JSON
- Jetty para el servidor web
- Gradle
Supongo que lo más importante es que no tiene que especificar explícitamente cada nueva clase de recursos que está agregando. Siempre y cuando los agregue al paquete que se está escaneando (consulte malicious.mustard.modules.JerseyModule
), se encontrarán automáticamente.
Creé una aplicación de muestra Guice / Jersey / Jetty / Jackson aquí:
http://github.com/sunnygleason/j4-minimal
Si tiene alguna pregunta o sugerencia sobre cómo mejorar el ejemplo, siéntase libre de enviarme un mensaje a través de github. El objetivo es hacer de esto una introducción muy accesible a REST en la pila de Java.
Espero que esto ayude - ¡que tengas un gran día!
-Soleado
El plugin de Jersey-Guice Javadoc proporciona una descripción bastante buena:
Encontré un proyecto interesante para los servicios web livianos Jetty + Guice + Jackson: https://github.com/talis/jersey-common/
Estos ejemplos fueron excelentes para mí, pero quería una pila MVC completa usando Jersey-Guice en su núcleo. He estado trabajando en refinar eso por algún tiempo. A partir de esta semana, esta pila de MVC se despliega completamente en el repositorio de Maven Central como un arquetipo. Esto significa que ahora puedes crear una nueva pila Jersey-Guice con un comando Maven:
mvn archetype:generate /
-DarchetypeGroupId=org.duelengine /
-DarchetypeArtifactId=duel-mvc-archetype /
-DarchetypeVersion=0.2.1
Esto genera automáticamente su propio proyecto con la nomenclatura del paquete especificada para que no tenga que editar manualmente un proyecto de plantilla.
Vea el proyecto Readme.md para más detalles: https://bitbucket.org/mckamey/duel-mvc
Los detalles sobre las vistas de doble cara (plantilla del lado del cliente y vistas del lado del servidor) que uso están aquí: https://bitbucket.org/mckamey/duel pero puede reemplazar con lo que sea que use.
Inspirada en la aplicación de ejemplo de Sunnys, he creado un proyecto de ejemplo similar que utiliza archivos WAR estándar para la implementación, por ejemplo, en Apache Tomcat. Puedes encontrar el proyecto aquí:
https://github.com/danbim/template-guice-jersey-tomcat
¡Que te diviertas! Daniel
La integración de Guice con Jersey no se ha estancado. El opuesto es verdad. Gracias a Paul y sus cohortes detrás de Jersey, la última versión 1.7 contiene una clase especial JerseyServletModule para trabajar con servlets basados en Guice. ¡La inyección de constructor basada en Guice en el recurso JAX-RS funciona! El problema es utilizar anotaciones JAX-RS como @QueryParam en el constructor de un recurso JAX-RS. ¡No lo necesitas! Utiliza Guice para inyección POJO todo el camino, incluidos los singletons. Entonces, JAX-RS es la guinda del pastel para analizar las API RESTful basadas en HTTP, como la ruta URL, los parámetros de consulta, el tipo de contenido, etc. No necesita un ejemplo de "fortaleza industrial" tampoco. Tanto Guice como Jersey ya han sido probados en batalla. Solo necesitas un ejemplo completo de trabajo para ver cómo funciona. Entonces puede experimentar funciones avanzadas por su cuenta. Consulte el siguiente enlace para obtener un ejemplo completo usando Guice 3.0 y Jersey 1.7, que son todas las últimas versiones:
http://randomizedsort.blogspot.com/2011/05/using-guice-ified-jersey-in-embedded.html
GWizard incluye un módulo que le brinda una integración lista para usar entre Jersey2 y Guice. Aquí hay un ejemplo de un servicio JAX-RS completo:
public class Main {
@Path("/hello")
public static class HelloResource {
@GET
public String hello() {
return "hello, world";
}
}
public static class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(HelloResource.class);
}
}
public static void main(String[] args) throws Exception {
Guice.createInjector(new MyModule(), new JerseyModule()).getInstance(Run.class).start();
}
}
Tenga en cuenta que esto se basa en el adaptador Squarespace jersey2-guice , que puede no funcionar correctamente con futuros puntos de lanzamiento de Jersey. GWizard también ofrece un módulo RESTEasy JAX-RS, que es el preferido.
Aquí hay una entrada de blog sobre esto que podría ayudar: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way