当前位置: 首页 > 知识库问答 >
问题:

在从Servlet调用的Session-Bean中,SessionContext始终为空

濮景龙
2023-03-14
protected void preventTransactionRolledBackException() {
    if (this.getSessionContext().getRollbackOnly()) {
        this.getSessionContext().setRollbackOnly();
    }
}
public class NewZekEclsServiceServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String operation = null;
        response.setContentType("text/xml");
        try { 
            PrintWriter out = response.getWriter(); 
            // Get Header data
            // Get Attribute data
            // Get Body data:
            InputStream body = request.getInputStream();
            String xml = IOUtils.toString(body, "UTF-8");

            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            docBuilderFactory.setNamespaceAware(true); // required as several namespaces might be used
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(new InputSource(new StringReader(xml)));

            operation = getOperation(doc); // method which scans the xml to retrieve the correct operation to use.

            if (operation.equalsIgnoreCase("Ping")) {

                // Calling the Adapter Bean:
                EclsTestBeanBean eclsTestBean = new EclsTestBeanBean();
                eclsTestBean.ejbCreate();

                PingIn pingIn = new PingIn();
                PingOut pingOut = eclsTestBean.ping(pingIn);

                String xmlString = convertEclsObjectToSOAPString(pingOut);
                out.print(xmlString);

            }
        }
    }
}
/**
 * Bean implementation class for Session Bean: EclsTestBean
 *
 * @ejb.bean
 *  name="EclsTestBean"
 *  type="Stateless"
 *  jndi-name="ejb/ch/zek/ecls/EclsTestBeanHome"
 *  view-type="remote"
 *  transaction-type="Bean"
 *
 * @ejb.home
 *  remote-class="ch.zek.ecls.EclsTestBeanHome"
 *
 * @ejb.interface
 *  remote-class="ch.zek.ecls.EclsTestBean"
 *
 */
public class EclsTestBeanBean implements javax.ejb.SessionBean {

    private Log log = LogFactory.getLog(EcodeAbfragenAction.class);

    private SessionContext mySessionCtx;

    public SessionContext getSessionContext() {
        return mySessionCtx;
    }

    public void setSessionContext(SessionContext ctx) {
        mySessionCtx = ctx;
    }

    public void ejbCreate() throws CreateException {}
    public void ejbActivate() {}
    public void ejbPassivate() {}
    public void ejbRemove() {}

    /**
     * Basic ping service for ECLS
     * @param parameters
     * @return
     * @throws PingEntityNotFoundException
     * @throws PingPermissionException
     * @throws PingSystemException
     */
    public ch.zek.ecls.PingOut ping(ch.zek.ecls.PingIn parameters) throws java.rmi.RemoteException, ch.zek.ecls.PingPermissionException, ch.zek.ecls.PingEntityNotFoundException, ch.zek.ecls.PingSystemException {

        PingOut pingOut = new PingOut();
        String pingAnswer = "Ping_ECLS_v1";
        String adapter = "";
        String operation = "";

        Parameter[] msgParams = new Parameter[1];
        String eclsEnvironment = "TEST";
        pingAnswer += "_" + eclsEnvironment;

        logAvailableEjbs();

        try {
            if (mySessionCtx != null) { // Why can it be null at all?
                log.debug("mySessionCtx: " + mySessionCtx.getContextData());
            } else {
                log.debug("mySessionCtx was null");
                InitialContext ic = new InitialContext();
                mySessionCtx = (SessionContext) ic.lookup("java:comp/env/sessionContext"); // gives error:  javax.naming.NameNotFoundException: Name "comp/env/sessionContext" not found in context "java:".
                System.out.println("mySessionCtx: " + mySessionCtx);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // creating the SOAP data... not relevant for the problem.
        msgParams[0] = new Parameter();
        msgParams[0].setValue(pingAnswer);
        SystemMessage systemMessage = new SystemMessage();
        systemMessage.setCode("OK");
        systemMessage.setMessage("Ping");
        systemMessage.setParameter(msgParams);
        pingOut.setSystemMessage(systemMessage);

        return pingOut;
    }

    /**
     * ONLY USED DURING DEVELOPMENT:
     * Helper method to print "accessible" EJBs.
     */
    protected void logAvailableEjbs() {
        try {
            //Get the Initial Context for the JNDI lookup for a local EJB
            InitialContext ic = new InitialContext();

            NamingEnumeration<NameClassPair> list;
            String level = "";
            String name = "";
            list = ic.list(level);
            while (list.hasMore()) {
                name = list.next().getName();
                System.out.println(level + "/" + name);
            }
            level = "ejb";
            list = ic.list(level);
            while (list.hasMore()) {
                name = list.next().getName();
                System.out.println(level + "/" + name);
            }   
            level = "java:comp";
            list = ic.list(level);
            while (list.hasMore()) {
                name = list.next().getName();
                System.out.println(level + "/" + name);
            }
            level = "java:comp/env";
            list = ic.list(level);
            while (list.hasMore()) {
                name = list.next().getName();
                System.out.println(level + "/" + name);
            }
            /*
            level = "java:comp/env/ejb"; // Throws Error!
            list = ic.list(level);
            while (list.hasMore()) {
                name = list.next().getName();
                System.out.println(level + "/" + name);
            }
            */
            level = "java:global";
            list = ic.list(level);
            while (list.hasMore()) {
                name = list.next().getName();
                System.out.println(level + "/" + name);
            }
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
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"

没有任何帮助。我理解应该自动创建SessionContext。但如果不是--你有什么选择去创建一个新的呢?进一步的问题:servlet还“创建”了一个我可以访问的会话(request.getSession()),但这是不同的(HTTPSession)。我想我不能共享或“转换”这个会话对象到会话bean?

共有1个答案

曾苗宣
2023-03-14
EclsTestBeanBean eclsTestBean = new EclsTestBeanBean();
 类似资料:
  • 问题内容: 如果将来我使用setMaxAge()设置cookie,那么当我在后续请求中将cookie读回内存时,getMaxAge()会返回-1。我已经通过Chrome的设置和检查器检查了实际的cookie,并且可以验证该过期日期确实设置为将来的60天。 为什么c.getMaxAge()总是返回-1? 问题答案: 浏览器不会发送cookie属性,例如路径和过期。它仅将名称和值发送回去。如果最大期限

  • 主要内容:Session 的工作原理,Session 与 Cookie 对比,Session API,设置 Session 过期时间,Session 的生命周期,Session 域对象,示例Session 是服务器端会话技术。当浏览器访问 Web 服务器的资源时,服务器可以为每个用户浏览器创建一个 Session 对象,每个浏览器独占一个 Session 对象。 由于每个浏览器独占一个 Session,所以用户在访问服务器的资源时,可以把数据保存在各自的 Session 中。当用户再次访问该服务

  • 问题内容: 我需要从servlet访问会话范围的bean。我已经试过了 在本作描述的职位。但是我只能得到null的结果,尽管UserBean的一个实例已经被无效化了。这些是我用于userBean的注释/导入: 为什么不能摆脱servlet的一些背景知识:我的jsf页面中有一个文件上传小程序。该applet期望可以发送POST请求的地址。(我无法编辑此发帖请求以添加更多字段或其他内容)。然后,我的s

  • 问题内容: 我想在JBoss中编写一个简单的servlet,它将在Spring bean上调用方法。目的是允许用户通过点击URL来启动内部工作。 在servlet中获取对Spring bean的引用的最简单方法是什么? JBoss Web服务允许您使用@Resource批注将WebServiceContext注入服务类。在普通servlet中,有什么可比的?解决此特定问题的Web服务将使用大锤压碎

  • 问题内容: 我正在创建一个新的Laravel项目,并且在调试表单请求的错误时,我注意到我的ErrorBag始终为空。即使在控制器返回时。我尝试了在互联网上找到的所有解决方案,但没有任何效果。 创建与作曲家新的项目,即使(如描述这里)使所有的字段为空时,我的开箱身份验证系统中有一个空的错误袋。 是的,所有路由都使用中间件组网络。 有什么想法导致此问题吗?(Session :: put()和Sessi

  • 我的程序很简单。我有一个有2个方法的类。我有另一个类在那里调用这两个方法。当调用第一个方法时,初始化arraylist并填充一些对象,然后调用第二个方法,简单地告诉arraylist的大小并打印出来。我不明白为什么我总是得到一个空的时候,第二个方法被调用。然而,当我在第一个方法中打印数组时,我得到了大小和所有it元素。Arraylist是公共得..请看一下代码。 在第一班