【问题标题】:EJB lookup with InitialContext使用 InitialContext 进行 EJB 查找
【发布时间】:2014-01-29 10:23:12
【问题描述】:

我在查找托管在服务器上的 EJB 时遇到问题。服务器本身是一个SAP环境,基本上就是一个修改过的tomcat。

我尝试了几个以

开头的查找字符串
java:comp/env/ 

ejb:/ 

但没有任何效果。

这是服务器对查找字符串的描述:

ejb:/appName=mycompany.de/reboard~report~cs, jarName=mycompany.de~reboard~report~cs.jar, beanName=com.sap.bpem.facade.api._simplified.adapted.BPMFacadeBeanSimplifiedEjb, interfaceName=com.sap.bpem.facade.api._simplified.adapted.BPMFacadeBeanSimplifiedLocal

对于远程部分:

ejb:/appName=mycompany.de/reboard~report~cs, jarName=mycompany.de~reboard~report~cs.jar, beanName=com.sap.bpem.facade.api._simplified.adapted.BPMFacadeBeanSimplifiedEjb, interfaceName=com.sap.bpem.facade.api._simplified.adapted.BPMFacadeBeanSimplifiedRemote

我尝试了这个查找字符串的不同组合,但都失败了。我可以使用以下方法将代理对象获取到 Bean:

InitialContext().lookup("ejb:/com.sap.bpem.facade.api._simplified.adapted.BPMFacadeBeanSimplifiedLocal");

但我需要直接 bean 访问。

这是 Bean 的定义方式:

@com.sap.engine.services.webservices.espbase.configuration.ann.rt.TransportBindingRT(AltPath="reboard/report/cs~ibsolution.de_com.sap.bpem.facade.api._simplified.adapted.BPMFacadeBeanSimplifiedEjb")
@UsedReferences(srIds="05bc3ba3-fd85-4381-b6f8-f8a4734b2815, 05bc3ba3-fd85-4381-b6f8-f8a4734b2815, 05bc3ba3-fd85-4381-b6f8-f8a4734b2815", wsdlLocations="ibsolution.de~reboard~report~cs.jar#META-INF/wsdl/consumed/src/wsdl/rootwsdl_BPMFacadeBeanImplService_BPMFacadeBeanImpl.wsdl, ibsolution.de~reboard~report~cs.jar#META-INF/wsdl/consumed/src/wsdl/rootwsdl_BPMFacadeBeanImplService_BPMFacadeBeanImpl.wsdl, ibsolution.de~reboard~report~cs.jar#META-INF/wsdl/consumed/src/wsdl/rootwsdl_BPMFacadeBeanImplService_BPMFacadeBeanImpl.wsdl")
@Stateless(name="com.sap.bpem.facade.api._simplified.adapted.BPMFacadeBeanSimplifiedEjb")
@EJB(name="BPMBean", beanInterface=BPMFacadeBeanSimplifiedLocal.class)
@WebService(
    portName="BPMFacadeBean_simplifiedBindingPort",
    endpointInterface="com.sap.bpem.facade.api._simplified.BPMFacadeBeanSimplified",
    serviceName="BPMFacadeBean_simplifiedBindingService",
    targetNamespace="http://api.facade.bpem.sap.com/_simplified",
    wsdlLocation="META-INF/wsdl/composed/src/wsdl/rootwsdl_importedwsdl_1_BPMFacadeBeanImplService_BPMFacadeBeanImpl_simplified.wsdl")
public class BPMFacadeBeanSimplifiedEjb implements 
    BPMFacadeBeanSimplifiedLocal,
    BPMFacadeBeanSimplifiedRemote

本地接口:

@Local
public interface BPMFacadeBeanSimplifiedLocal
    extends com.sap.bpem.facade.api._simplified.BPMFacadeBeanSimplified {}

远程接口:

@Remote
public interface BPMFacadeBeanSimplifiedRemote
    extends com.sap.bpem.facade.api._simplified.BPMFacadeBeanSimplified {}

BPMFacadeBean简化接口:

@javax.jws.WebService(name = "BPMFacadeBean_simplified", targetNamespace = "http://api.facade.bpem.sap.com/_simplified")
@javax.jws.soap.SOAPBinding(parameterStyle = javax.jws.soap.SOAPBinding.ParameterStyle.WRAPPED, style = javax.jws.soap.SOAPBinding.Style.DOCUMENT, use = javax.jws.soap.SOAPBinding.Use.LITERAL)
public interface BPMFacadeBeanSimplified {

@javax.jws.WebMethod(operationName = "getActiveProcesses", action = "http://api.facade.bpem.sap.com/_simplified/getActiveProcesses")
@javax.xml.ws.RequestWrapper(localName = "getActiveProcesses", targetNamespace = "http://api.facade.bpem.sap.com/", className = "com.sap.bpem.facade.api.GetActiveProcesses")
@javax.xml.ws.ResponseWrapper(localName = "getActiveProcessesResponse", targetNamespace = "http://api.facade.bpem.sap.com/", className = "com.sap.bpem.facade.api.GetActiveProcessesResponse")
@javax.jws.WebResult(name = "return", targetNamespace = "")
public java.util.List<com.sap.bpem.facade.api.ProcessInfo> getActiveProcesses(@javax.jws.WebParam(name = "locale", targetNamespace = "") java.lang.String locale);

/**
 * Java representation of web method [getProcessDescription].
 */
@javax.jws.WebMethod(operationName = "getProcessDescription", action = "http://api.facade.bpem.sap.com/_simplified/getProcessDescription")
@javax.xml.ws.RequestWrapper(localName = "getProcessDescription", targetNamespace = "http://api.facade.bpem.sap.com/", className = "com.sap.bpem.facade.api.GetProcessDescription")
@javax.xml.ws.ResponseWrapper(localName = "getProcessDescriptionResponse", targetNamespace = "http://api.facade.bpem.sap.com/", className = "com.sap.bpem.facade.api.GetProcessDescriptionResponse")
@javax.jws.WebResult(name = "return", targetNamespace = "")
public java.lang.String getProcessDescription(@javax.jws.WebParam(name = "activeVersionId", targetNamespace = "") java.lang.String activeVersionId, @javax.jws.WebParam(name = "locale", targetNamespace = "") java.lang.String locale);

}

在这种情况下,正确的查找字符串是什么?

感谢您的帮助!

【问题讨论】:

  • 您能解释一下为什么您在尝试进行远程查找时尝试查找本地界面吗?你也没有提到你的环境是什么。哪个服务器/容器,哪个版本......这可能在很大程度上决定了正确的查找名称是什么,尽管容器的文档应该是您获取正确信息的第一步。
  • 将服务器添加到问题描述中。基本上它是一个tomcat。
  • 我对本地界面的评论不变。
  • 也添加了,谢谢!

标签: java ejb lookup initial-context


【解决方案1】:

没有可移植的方式来访问 bean 实例,所有对 ejb 的访问都应该通过代理,因为这是容器可以提供它应该为您提供的所有服务的唯一方式(拦截器、依赖注入、安全、事务...),这就是 EJB 规范的设计方式,来自 EJB 3.0 规范(第 4.7.3 节):

会话业务接口的容器实现,由部署生成 工具,实现特定于会话 bean 的业务方法。 每个业务方法的实现都必须激活实例(如果实例处于被动 state),调用任何业务方法拦截器方法,并调用匹配的业务方法 实例。 容器提供者负责提供equals和hashCode的实现 业务接口的方法,符合3.6.5节的要求

此外,我无法想象您需要直接访问 bean 实例的原因

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 2018-03-14
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多