Quiero implementar una pequeña aplicación web con J2EE. He creado los DAOs, los Services y estoy con los Beans que controlarán las jsp. He hecho pruebas unitarias con JUnit en los DAOS y Services y funcionan pero cuando los llamo desde la JSP me devuelve un error por null al llamar al Service correspondiente (UserService). Estoy casi segura de que es por la configuración pero non encuentro el problema. Os pongo aquí la configuración a ver si me podeis ayudar. Muchas Gracias.
faces-config.xml
<managed-bean>
<managed-bean-name>LoginBean</managed-bean-name>
<managed-bean-class>org.sm.khp.web.beans.LoginBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>userSession</property-name>
<value>#{UserSession}</value>
</managed-property>
<managed-property>
<property-name>userService</property-name>
<value>#{UserService}</value>
</managed-property>
</managed-bean>
applicationContext.xml
<bean id="UserService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.sm.khp.services.userservices.UserService</value>
</property>
<property name="transactionManager"><ref local="transactionManager"/></property>
<property name="target"><ref local="UserServiceImpl"/></property>
<property name="transactionAttributes">
<props>
<prop key="list*">readOnly, PROPAGATION_SUPPORTS, ISOLATION_DEFAULT</prop>
<prop key="show*">readOnly, PROPAGATION_SUPPORTS, ISOLATION_DEFAULT</prop>
<prop key="exist*">readOnly, PROPAGATION_SUPPORTS, ISOLATION_DEFAULT</prop>
<prop key="create*">PROPAGATION_REQUIRED, ISOLATION_DEFAULT</prop>
<prop key="register*">PROPAGATION_REQUIRED, ISOLATION_DEFAULT</prop>
</props>
</property>
</bean>
<bean id="UserServiceImpl" class="org.sm.khp.services.userservices.UserServiceImpl">
<property name="userDao">
<ref bean="UserDao" />
</property>
</bean>
Hola,
Que los tests unitarios con JUnit funcionen pero llamando desde la JSP el Service llegue nulo es una pista muy clara: en tu test probablemente estás creando el Service directamente (new MiServicio()), mientras que en la aplicación web real esperas que algo se lo inyecte automáticamente al Bean que controla la JSP, y ese «algo» no está configurado o no se está ejecutando en el momento en que la JSP accede al Bean.
Las causas más comunes, según cómo estés intentando inyectar el Service en el Bean:
Si usas anotaciones tipo @EJB o @Inject en el Bean, la inyección solo funciona si ese Bean está siendo gestionado por el contenedor (por ejemplo, es un Managed Bean de JSF registrado correctamente, o un componente CDI). Si en algún punto estás creando el Bean con new a mano en vez de dejar que el contenedor lo instancie, la anotación de inyección nunca se procesa, y el campo se queda a null aunque la anotación esté ahí puesta.
Comprueba tu faces-config.xml (o las anotaciones @ManagedBean/@Named si usas anotaciones en vez de XML) para confirmar que el Bean que la JSP referencia está realmente dado de alta como managed bean, y no es una instancia que estás creando tú mismo en algún punto intermedio.
Un patrón de diagnóstico rápido: añade un log al principio del método del Bean que llama al Service, imprimiendo si this es la instancia que esperas y si el campo del Service ya viene null desde el principio del método (fallo de inyección) o se vuelve null en algún punto intermedio del propio método (ahí el problema sería otro, no de inyección).
Si nos dices exactamente cómo está anotado el Service en el Bean (@EJB, @Inject, o si lo instancias tú mismo en el constructor), te puedo señalar el punto exacto que revisar.
David Carrero
