Java SessionContext在从Servlet调用的会话Bean中始终为null

Java SessionContext在从Servlet调用的会话Bean中始终为null,java,servlets,jakarta-ee,ejb,sessioncontext,Java,Servlets,Jakarta Ee,Ejb,Sessioncontext,我的工作是使用Servlet编写一种webservice适配器,然后Servlet调用适配器EJB(SOAP-webservice),适配器EJB反过来调用现有的服务方法(也叫EJB)。 现有的体系结构是基于EJB2.0的,我现在不能更改它。 外部客户应该直接访问Servlet,而不是webservice类。 这样做的原因是需要使用HTTPRequest中的信息(从证书和HTTP头获取和映射用户id)来完成一些预处理。 因此,Servlet对doPost()方法作出反应,执行预处理,如解析和编组

我的工作是使用Servlet编写一种webservice适配器,然后Servlet调用适配器EJB(SOAP-webservice),适配器EJB反过来调用现有的服务方法(也叫EJB)。 现有的体系结构是基于EJB2.0的,我现在不能更改它。 外部客户应该直接访问Servlet,而不是webservice类。 这样做的原因是需要使用HTTPRequest中的信息(从证书和HTTP头获取和映射用户id)来完成一些预处理。 因此,Servlet对doPost()方法作出反应,执行预处理,如解析和编组SOAP XML数据,然后调用适配器EJB(无状态会话Bean), 更准确地说,webservice方法将触发不同EJB中的现有服务方法。 直到EJB需要一个现有的会话resp之前,这一切都很好。SessionContext,与处理事务回滚的以下情况类似:

受保护的void preventionTransactionRolledBackException(){
if(this.getSessionContext().getRollbackOnly()){
this.getSessionContext().setRollbackOnly();
}
}
在我的设置中,SessionContext始终为空。 由于整个应用程序已经相当复杂,我尝试只使用Servlet和一个EJB发布一个简化的设置,希望不要排除相关的内容。 系统:WebSphereApplicationServer8.5

Servlet:

公共类NewZekEclsServiceServlet扩展了HttpServlet{
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{
字符串操作=null;
setContentType(“text/xml”);
试试{
PrintWriter out=response.getWriter();
//获取标题数据
//获取属性数据
//获取身体数据:
InputStream body=request.getInputStream();
字符串xml=IOUtils.toString(正文,“UTF-8”);
DocumentBuilderFactory docBuilderFactory=DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);//可能会使用多个名称空间,因此必需
DocumentBuilder docBuilder=docBuilderFactory.newDocumentBuilder();
documentdoc=docBuilder.parse(新的InputSource(新的StringReader(xml));
operation=getOperation(doc);//方法,该方法扫描xml以检索要使用的正确操作。
if(operation.equalsIgnoreCase(“Ping”)){
//调用适配器Bean:
eclsTestBean eclsTestBean=新的eclsTestBean();
ejbCreate();
PingIn PingIn=新PingIn();
PingOut-PingOut=eclsTestBean.ping(pingIn);
字符串xmlString=convertexlsobjecttosoapstring(pingOut);
打印输出(xmlString);
}
}
}
}
EJB(由RationalApplicationDeveloper 9.0生成):

/**
*会话Bean的Bean实现类:EclsTestBean
*
*@ejb.bean
*name=“EclsTestBean”
*type=“无状态”
*jndi name=“ejb/ch/zek/ecls/EclsTestBeanHome”
*视图类型=“远程”
*事务类型=“Bean”
*
*@ejb.home
*远程类=“ch.zek.ecls.EclsTestBeanHome”
*
*@ejb.interface
*远程类=“ch.zek.ecls.EclsTestBean”
*
*/
公共类EclsTestBean实现javax.ejb.SessionBean{
private Log Log=LogFactory.getLog(ecodeabfrageAction.class);
私人会话上下文mySessionCtx;
public SessionContext getSessionContext(){
返回mySessionCtx;
}
public void setSessionContext(SessionContext ctx){
mySessionCtx=ctx;
}
public void ejbCreate()引发CreateException{}
public void ejbActivate(){}
public void ejbPassivate(){}
public void ejbRemove(){}
/**
*ECL的基本ping服务
*@param参数
*@返回
*@抛出PingEntityNotFoundException
*@PingPermissionException
*@PingSystemException
*/
public ch.zek.ecls.PingOut ping(ch.zek.ecls.PingIn参数)抛出java.rmi.RemoteException、ch.zek.ecls.PingPermissionException、ch.zek.ecls.PingEntityNotFoundException、ch.zek.ecls.PingSystemException{
PingOut PingOut=新PingOut();
字符串pingAnswer=“Ping\u ECLS\u v1”;
字符串适配器=”;
字符串操作=”;
参数[]msgParams=新参数[1];
字符串eclsEnvironment=“TEST”;
pingAnswer+=“\u”+eclsEnvironment;
logAvailableEjbs();
试一试{
如果(mySessionCtx!=null){//为什么它可以为null?
调试(“mySessionCtx:+mySessionCtx.getContextData());
}否则{
调试(“mySessionCtx为空”);
InitialContext ic=新的InitialContext();
mySessionCtx=(SessionContext)ic.lookup(“java:comp/env/SessionContext”);//给出错误:javax.naming.NameNotFoundException:Name“comp/env/SessionContext”未在上下文“java:”中找到。
System.out.println(“mySessionCtx:+mySessionCtx”);
}
}捕获(例外e){
e、 printStackTrace();
}
//创建SOAP数据…与问题无关。
msgParams[0]=新参数();
msgParams[0]。设置值(pingAnswer);
SystemMessage SystemMessage=新的SystemMessage();
systemMessage.setCode(“确定”);
systemMessage.setMessage(“Ping”);
systemMessage.setParameter(msgParams);
pingOut.setSystemMessage(系统消息);
返回pingOut;
}
/**
*仅在开发期间使用:
*用于打印“可访问”EJB的帮助器方法。
*/
受保护的void logAvailableEjbs(){
试一试{
//获取本地EJB的JNDI查找的初始上下文
InitialContext ic=新的InitialContext();
SystemOut     O /jta
SystemOut     O /eis
SystemOut     O /cell
SystemOut     O /thisNode
SystemOut     O /DefaultDatasource
SystemOut     O /services
SystemOut     O /jdbc
SystemOut     O /servername
SystemOut     O /com.ibm.websphere.ejbcontainer
SystemOut     O /com
SystemOut     O /zek
SystemOut     O /wm
SystemOut     O /ejb
SystemOut     O /Increment
SystemOut     O /tm
SystemOut     O ejb/ivtEJBObject
SystemOut     O ejb/ch
SystemOut     O ejb/mgmt
SystemOut     O java:comp/ValidatorFactory
SystemOut     O java:comp/TransactionSynchronizationRegistry
SystemOut     O java:comp/ORB
SystemOut     O java:comp/Validator
SystemOut     O java:comp/UserTransaction
SystemOut     O java:comp/env
SystemOut     O java:comp/BeanManager
SystemOut     O java:comp/websphere
SystemOut     O java:comp/HandleDelegate
SystemOut     O java:global/com.ibm.ws.AppNameSpaces
SystemOut     O java:global/NewZekEar
SystemOut     O java:global/SchedulerCalendars
SystemOut     O java:global/DefaultApplication
SystemOut     O java:global/cell
SystemOut     O java:global/query
SystemOut     O java:global/ManagementEJB
SystemOut     O java:global/ivtApp
@Resource
private SessionContext mySessionCtx;
transaction-type="Container"
EclsTestBeanBean eclsTestBean = new EclsTestBeanBean();