Cómo configurar un EJB tanto locales como remotos en WebSphere
-
26-09-2019 - |
Pregunta
Tengo un EJB sin estado SessionBean con bith @ local y @Remote anotaciones. El código está trabajando muy bien en el servidor WebLogic. Sin embargo, en su despliegue en WebSphere da siguiente excepción.
bm.ejs.container.EJBConfigurationException: BUSINESS_INTERFACE_DESIGNATED_AS_BOTH_REMOTE_AND_LOCAL: 'oracle.odc.session.ODCSession'
La clase de interfaz de negocio oracle.odc.session.ODCSession no puede ser a la vez local y remoto.
¿Hay alguna solución disponible para que funcione sin necesidad de escribir EJB separadas para la invocación remota y local?
Solución
Una solución es tener una interfaz de base con las declaraciones de métodos y luego tener una interfaz local y un inteface a distancia, que se extienden la interfaz de base, por ejemplo.
public interface MyEJBBase {
public void foo();
public void bar();
}
@Local
public interface MyEJBLocal extends MyEJBBase {}
@Remote
public interface MyEJBRemote extends MyEJBBase {}
Otros consejos
Que yo sepa no hay manera, el error parece bastante descriptiva.
A partir de la sección 4.9.7 de la especificación EJB 3.2:
La misma interfaz de negocio no puede ser a la vez un local y un mando a distancia interfaz de negocio del grano.
Se puede usar subinterfaces como solución alternativa:
public interface MyInterface { /* all the methods */ }
public interface MyRemoteInterface extends MyInterface { /* empty */ }
@Stateless
@Remote(MyRemoteInterface.class)
@Local(MyInterface.class)
public class MyBean { /* ... */ }
Nota que los parámetros y valores de retorno de los métodos de la interfaz remoto se pase por valor pero los parámetros y valores de retorno de los métodos de la interfaz local será pase por referencia.