2011-10-21 13 views
12

Sto creando una nuova webapp Java con Spring MVC 3.0 e voglio utilizzare il più possibile Java EE 6 standard. (Sono su Glassfish 3.1.1.) Il vero driver sta volendo utilizzare un framework web MVC piuttosto che JSF.Utilizzo dell'annotazione Spring MVC 3.0 e @EJB wtihout mappedName?

Quindi sto cercando il modo migliore per iniettare EJB nei miei controller Spring. Ho avuto un certo successo ma non sono contento di come appare e speravo di trovare un modo migliore.

questo ha funzionato, trovando la via EJB 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 
} 

Ma io sono infelice con la necessità della "mappedName" sul l'annotazione @EJB nel controller.

C'è un modo migliore per farlo?

La buona notizia, tuttavia, è che posso usare la stessa annotazione @Inject negli EJB e nei bean Spring e l'unica differenza è quale framework sta creando l'oggetto e facendo l'iniezione.

risposta

-1

Per la primavera, si potrebbe avvolgere il lookup JNDI in JndiObjectFactoryBean:

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

Allora ti probabilmente (correggetemi se sbaglio) essere in grado di usarlo con @Injectsenza la @Named("serviceBean") annotazione:

@Inject 
private Service service; 
+0

Questo semplicemente spinge il problema in XML, che si sente peggio IMO. – wrschneider

+0

@ wrschneider99 Perché? Volevi sbarazzarti del parametro * mappedName * e così l'hai ottenuto. Non era questa la domanda? Altrimenti si potrebbe fare la ricerca JNDI nel codice e questo sarebbe completamente portatile, ma brutto. – MaDa

+0

Speravo che ci fosse un modo in cui la ricerca JNDI potesse avvenire per convenzione, in modo tale che un nome mappato esplicito non fosse necessario. O se necessario, non mi dispiacerebbe spingere la configurazione sull'annotazione Stateless, per sfruttare tutti i valori predefiniti inerenti all'interpretazione di Spring dell'annotazione EJB. – wrschneider

2

Se si utilizza

mappedName="java:module/Service" 

invece di

mappedName="java:global/springtest/Service" 

non c'è bisogno di preoccuparsi per l'appname. Ciò rende il codice più portabile. Immagino che risolverà alcuni dei tuoi problemi