【问题标题】:Calling EJB Session outside of doGet or doPost在 doGet 或 doPost 之外调用 EJB Session
【发布时间】:2014-02-23 21:31:00
【问题描述】:

我在确定是否可以在不采用 HttpServletRequest 和 HttpServletResponse 参数的方法中实际调用会话 bean 的方法时遇到了一些问题?

意识到代码在 doGet 和 doPost 方法中工作,我修改了一个自定义方法来获取请求和响应的参数,突然它开始工作了。

我的目标是在方法参数中没有请求和响应的情况下让方法正常工作(调用会话 bean 方法)。

但是这里是有问题的版本的代码,它在 itemRegistrationSession.openConnection() 上授予 NullPointerException;

package web;

import java.io.IOException;
import java.util.ArrayList;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import auction.itemRegistrationRemote;
import auction.userRegistrationRemote;

/**
 * Servlet implementation class processItem
 */
@WebServlet("/processItem")
public class processItem extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB itemRegistrationRemote itemRegistrationSession;
    @EJB userRegistrationRemote processRegistrationSession;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public processItem() {
        super();
        getCategories();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //ArrayList<String> categories = getCategories(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected ArrayList<String> getCategories() {

        System.out.println("Hello from getCategories()");
        itemRegistrationSession.openConnection();
        System.out.println("Hello2 from getCategories()");
        ArrayList<String> categories = itemRegistrationSession.getCategories();
        itemRegistrationSession.closeConnection();
        return categories;
    }
}

package auction;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.ejb.LocalBean;
import javax.ejb.Singleton;

/**
 * Session Bean implementation class itemRegistration
 */
@Singleton
public class itemRegistration implements itemRegistrationRemote {

    Connection con;
    PreparedStatement prepStat;
    ResultSet resultSet;

    final String ITEM_NAME = "ITEM_NAME";
    final String CATEGORY_NAME = "CATEGORY_NAME";
    final String USER_NAME = "USER_NAME";
    final String ITEM_MODEL = "ITEM_MODEL";
    final String ITEM_DESCRIPTION = "ITEM_DESCRIPTION";
    /**
     * Default constructor. 
     */
    public itemRegistration() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void openConnection() {
        System.out.println("Openning connection for itemRegistration");
        try {
            String driver = "org.apache.derby.jdbc.EmbeddedDriver";
            Class.forName(driver).newInstance();
        } catch (InstantiationException e) {
            System.out.println("Openning database connection - Instantiation Exception " + e.getMessage());
        } catch (IllegalAccessException e) {
            System.out.println("Openning database connection - IllegalAccessException " + e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println("Openning database connection - ClassNotFoundException " + e.getMessage());
        }
        try {
            con = DriverManager.getConnection("jdbc:derby:C:/Users/Adrian/MyDB;upgrade=true", "adrian", "testero");
        } catch (SQLException e) {
            System.out.println("Openning database connection - SQLException " + e.getMessage());
        }
    } // End of openConnection method

    @Override
    public void closeConnection() {
        try {
            resultSet.close();
            prepStat.close();
            con.close();
        } catch (SQLException e) {
            System.out.println("Closing database connection - SQLException " + e.getMessage());
        }

    } // End of closeConnection method

    @Override
    public ArrayList<String> getCategories() {
        ArrayList<String> categories = new ArrayList<String>();
        try {
            prepStat = con.prepareStatement("SELECT * FROM CATEGORY");
            resultSet = prepStat.executeQuery();
            int i = 1;
            while (resultSet.next()) {
                categories.add(resultSet.getString(i));
                i++;
            }
        } catch (SQLException e) {
            System.out.println("getCategories SQLException - " + e.getMessage());
        }
        return categories;
    }

}

【问题讨论】:

  • 能否也显示 itemRegistrationRemote 代码?
  • @Jakub Hr 刚刚添加。

标签: java session ejb


【解决方案1】:

听起来像

的依赖注入
@EJB itemRegistrationRemote itemRegistrationSession 

不工作。尝试添加一条显示 itemRegistrationSession 对象值的日志语句,以查看该成员是否已正确初始化。

【讨论】:

    【解决方案2】:

    您收到异常是因为当您调用 getCategories() 时,尚未注入 EJB。

    在构造函数调用时注入还没有发生,请记住对象刚刚被创建,所以容器还没有时间注入任何东西,正确的方法是使用@PostConstruct注解.来自 javadoc:

    PostConstruct 注解用于需要在依赖注入完成后执行任何初始化的方法...

    因此您需要将getCategories() 调用移动到@PostConstruct 注释方法,如下所示:

    @WebServlet("/processItem")
    public class processItem extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    @EJB itemRegistrationRemote itemRegistrationSession;
    @EJB userRegistrationRemote processRegistrationSession;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public processItem() {
        super();
    }
    
    @Postconstruct
    void init() {
      getCategories();
    }...
    

    【讨论】:

    • 太好了,它在这种情况下完成了工作。但是,当我想从其他类调用 getCategories 的方法时,即使我将 @Postconstruct 注释放在它上面,它似乎也存在这种注入问题。知道我需要如何处理吗?非常感谢
    • 如果场景似乎不适合依赖注入场景,您可能需要使用 JNDI 加载服务。这涉及调用 JNDI 查找,这是在创建注释之前所做的事情,以使我们的生活更轻松。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2014-08-09
    • 2014-02-11
    • 2011-08-18
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多