majulvez / easyredsys

Librería que facilita la integración con la pasarela de pago Redsys para aplicaciones Java
https://www.miguelangeljulvez.com/es/servicios/desarrollo-software/easyredsys
GNU General Public License v3.0
12 stars 6 forks source link

Inyectar AppConfig en WebService publicado en Tomcat 8.5 #11

Closed minifreak closed 5 years ago

minifreak commented 5 years ago

No consigo inyectar de ninguna manera la clase que implementa AppConfig. He configurado satisfactoriamente Weld, pero al parecer solo me permite inyectar el bean en Servlets, Filters y Listeners.

Estoy atado a Tomcat por lo que no puedo cambiar a WildFly u otro AS así que si alguien se ha encontrado con este problema se agredece cualquier ayuda.

majulvez commented 5 years ago

Hola @minifreak ,

he creado una rama con una configuración compatible con tomcat 8. La tienes aquí

https://github.com/majulvez/easyredsys/tree/tomcat-8

El tema es que no se está inyectando el bean AppConfig correctamente en tomcat 8 usando la anotación @Inject y como workaround lo que he hecho es coger ese bean del contexto mediante programación

https://github.com/majulvez/easyredsys/blob/tomcat-8/easyredsys-server/src/main/java/com/miguelangeljulvez/easyredsys/server/ws/rest/InotificacionSISRest.java#L35

Para usar esta versión, compila la rama "tomcat-8" con gradle build, replica la configuración de ejemplo de integration-example-tomcat-8-war en tu aplicación y copia easyredsys-client-1.1.4-SNAPSHOT.jar y easyredsys-server-1.1.4-SNAPSHOT.jar al directorio WEB-INF/lib de tu aplicación (marcando las dependencias de easyredsys como provided en tu pom.xml o build.gradle).

No integro este cambio en la rama general de momento porque quiero ver bien el tema de por qué no se inyecta correctamente en tomcat 8 (están los beans.xml por lo que no haría falta registrarlo en un binder, en teoría) y por que además tengo que programar una prueba correctamente con arquillian.

Un saludo

minifreak commented 5 years ago

Hola @majulvez ,

Muchas gracias por tu respuesta.

Según he podido averiguar, no se inyecta porque Tomcat no implementa todo el stack J2EE, al ser simplemente un contenedor de Servlets, por lo que la inyección de beans en WebServices no funciona. Incluso Weld me indica que CDI está solo disponible en Servlets, Filters y Listeners. Además he descubierto que existen proyectos como Meecrowave o TomEE que básicamente añaden las funcionalidades de la especificación J2EE no implementadas en Tomcat. En el caso del sistema que uso (ScipioERP basado en Apache OFBiz) no tiene mucho sentido, ya que Tomcat viene embebido. Y por supuesto que antes de reemplazar Tomcat por TomEE, lo reemplazaría por WildFly u otro AS open source. Pero vaya, eso esta fuera del cualquier escenario en estos momentos.

A todo esto, ayer conseguí que funcionara extendiendo tu clase InotificacionSISImpl y reemplazándola por la original definida en sun-jaxws.xml, con la anotación @WebService apuntando a tu endpointInterface original. De esta manera he podido substituir el @Inject por la instanciación de mi classe AppConfig directamente en el constructor y sobreescribir el método notificación. Funciona perfectamente

No he visto tu solución, pero después le echo un vistazo. Seguramente vaya en la misma línea. En caso contrario te creo un merge request si te interesa.

De todos modos, te agradezco mucho tu ayuda!

majulvez commented 5 years ago

Lo que has hecho está perfecto.

También se podría solucionar usando reflexión en lugar de @Inject que es lo que uso para coger el bean de configuración en la implementación de axis. Aunque bueno, si pudiera evitar tener que usar reflexión y usar especificaciones casi que mejor. Aunque por otro lado, menos librerías necesarias para usarlo en tomcat (que al final es lo que mas se usa).

majulvez commented 5 years ago

Sí, te confirmo que voy a usar reflexión en lugar de inyección para facilitar la integración con tomcat. He subido el código y las pruebas de integración en distintos servidores a tomcat-8. En unos días subiré a master y publicaré en repositorios maven.

minifreak commented 5 years ago

Muchas gracias @majulvez

En cuanto lo tengas subido reemplazaré mi solución por la tuya. Así me será más fácil mantenerme alineado con tu implementación en futuros cambios que se puedan dar.

majulvez commented 5 years ago

Hola @minifreak ,

acabo de publicar el cambio en los repositorios maven (v1.1.4). A lo largo del día de hoy estará disponible.

Cierro este ticket, pero si tuvieras cualquier problema con la nueva versión me dices. He creado un ejemplo de configuración para tomcat 8 y he programado unas pruebas, por lo que espero que no haya mucho problema.

Un saludo!

minifreak commented 5 years ago

Hola @majulvez,

En cuanto pueda, lo pruebo y te comento. Lo tengo funcionando bien con mis cambios pero tarde o temprano actualizaré y usaré los tuyos.

Muchisimas gracias por tu ayuda!

Saludos!