2011-10-21 21 views
12

Estoy haciendo una nueva aplicación web Java con Spring MVC 3.0 y quiero usar todo el material estándar de Java EE 6 que pueda. (Estoy en Glassfish 3.1.1.) El verdadero controlador es querer usar un framework web MVC en lugar de JSF.¿Utilizando Spring MVC 3.0 y la anotación @EJB sin mappedName?

Así que estoy buscando la mejor manera de inyectar EJB en mis controladores Spring. Tuve cierto éxito, pero no estoy contento con su aspecto y esperaba encontrar una mejor manera.

Esto funcionó, encontrando el EJB a través de JNDI:

// EJB 
@Stateless 
public class Service { 
    @PersistenceContext(name="MAIN") 
    private EntityManager em; 

    public void doSomething() { .... } 

} 

// Spring 
@Controller 
public class HomeController { 
    @EJB(mappedName="java:global/springtest/Service") 
    private Service service; 

    // controller methods use service 
} 

Pero estoy satisfecho con la necesidad de "mappedName" en la anotación @EJB en el controlador.

¿Hay una mejor manera de hacerlo?

La buena noticia, sin embargo, es que puedo usar la misma anotación @Inject en EJBs y Spring beans y la única diferencia es qué marco está creando el objeto y haciendo la inyección.

Respuesta

-1

para la primavera, se puede envolver la búsqueda JNDI en JndiObjectFactoryBean:

<bean id="serviceBean" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:global/springtest/Service" /> 
    <property name="resourceRef" value="true" /> 
</bean> 

entonces usted probablemente (corríjanme si me equivoco) ser capaz de utilizarlo con @Inject sin la @Named("serviceBean") anotación:

@Inject 
private Service service; 
+0

Eso solo lleva el problema a XML, que se siente peor IMO. – wrschneider

+0

@ wrschneider99 ¿Por qué? Querías deshacerte del parámetro * mappedName * y así lo conseguiste. ¿Esa no era la pregunta? De lo contrario, podría hacer la búsqueda JNDI en el código y eso sería totalmente portátil, pero feo. – MaDa

+0

Tenía la esperanza de que hubiera alguna forma de que la búsqueda JNDI pudiera ocurrir por convención, de modo que un mappedName explícito fuera innecesario. O si es necesario, no me importaría llevar la configuración a la anotación sin estado, para aprovechar cualquier defecto inherente a la interpretación de Spring de la anotación EJB. – wrschneider

2

Si utiliza

mappedName="java:module/Service" 

en lugar de

mappedName="java:global/springtest/Service" 

usted no tiene que preocuparse por el nombreaplic. Esto hace que el código sea más portátil. Supongo que eso resolverá algunos de sus problemas

Cuestiones relacionadas