Come configurare un EJB sia locale che remoto su Websphere
-
26-09-2019 - |
Domanda
Ho uno stateless EJB SessionBean con bith @local e @Remote annotazioni. Il codice sta funzionando benissimo in WebLogic Server. Tuttavia sulla distribuzione per Websphere dà seguente eccezione.
bm.ejs.container.EJBConfigurationException: BUSINESS_INTERFACE_DESIGNATED_AS_BOTH_REMOTE_AND_LOCAL: 'oracle.odc.session.ODCSession'
La classe di interfaccia di business oracle.odc.session.ODCSession non può essere sia a distanza e locale.
C'è qualche soluzione disponibile per farlo funzionare senza scrivere EJB separati per l'invocazione remota e locale?
Soluzione
Una soluzione è quella di avere un'interfaccia di base con le dichiarazioni di metodo e quindi avere un'interfaccia locale e un inteface remoto, che si estendono l'interfaccia di base, per esempio.
public interface MyEJBBase {
public void foo();
public void bar();
}
@Local
public interface MyEJBLocal extends MyEJBBase {}
@Remote
public interface MyEJBRemote extends MyEJBBase {}
Altri suggerimenti
Per quanto ne sappia non c'è modo, l'errore sembra abbastanza descrittivo.
Dalla sezione 4.9.7 della specifica EJB 3.2:
La stessa interfaccia business non può essere sia un locale e un telecomando interfaccia business del fagiolo.
È possibile utilizzare subinterfaces come una soluzione:
public interface MyInterface { /* all the methods */ }
public interface MyRemoteInterface extends MyInterface { /* empty */ }
@Stateless
@Remote(MyRemoteInterface.class)
@Local(MyInterface.class)
public class MyBean { /* ... */ }
Si noti che i parametri ei valori restituiti dei metodi sull'interfaccia remota sarà passaggio per valore ma i parametri e valori restituiti dei metodi sull'interfaccia locale sarà passaggio per riferimento.