Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EntityManager空指针_Java_Eclipselink - Fatal编程技术网

Java EntityManager空指针

Java EntityManager空指针,java,eclipselink,Java,Eclipselink,我试图检索一个简单的JSON列表,将这个JSON数组转换为Eclipselink对象,并将它们放在postgres中。尽管我一直从EntityManager获取空指针,但我已经迷失了方向 我正在从测试Web服务调用我的控制器: @WebServlet(name = "Test", urlPatterns = {"/Test"}) public class Test extends HttpServlet { /** * Processes requests for both

我试图检索一个简单的JSON列表,将这个JSON数组转换为Eclipselink对象,并将它们放在postgres中。尽管我一直从EntityManager获取空指针,但我已经迷失了方向

我正在从测试Web服务调用我的控制器:

@WebServlet(name = "Test", urlPatterns = {"/Test"})
public class Test extends HttpServlet {


    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            // HERE I CALL CUSTOM METHODS
            AppController appConn = new AppController();
            appConn.updateAppList();
        } finally {            
            out.close();
        }
    }
在控制器中,我正在尝试保留这些已转换的对象:

public class AppController {
    @PersistenceUnit(unitName="UserPU")
    EntityManagerFactory emf;
    EntityManager em = emf.createEntityManager();


    public AppController() {

    }

    public void updateAppList() {
        try {
            URLController urlConn = new URLController(Config.allAppsURL);
            JsonElement jelement = new JsonParser().parse(urlConn.toString());
            JsonObject  jobject = jelement.getAsJsonObject();
            jobject = jobject.getAsJsonObject("applist");
            JsonArray jarray = jobject.getAsJsonArray("apps");

            ArrayList<SteamApp> apps = new ArrayList<App>(){};
            for(int i = 0; i < jarray.size(); i++) {
                JsonObject jsteamObject = jarray.get(i).getAsJsonObject();
                App app = new SteamApp(jsteamObject.get("appid").getAsLong(), jsteamObject.get("name").toString());
                apps.add(app);
                //System.out.println("App[" + app.getAppid() + ", " + app.getName() + "] \n\r");
            }

            em.persist(apps);
            em.flush();

        } catch (Exception ex) {
            Logger.getLogger(AppController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
公共类AppController{
@PersistenceUnit(unitName=“UserPU”)
实体管理工厂emf;
EntityManager em=emf.createEntityManager();
公共应用程序控制器(){
}
public void updateAppList(){
试一试{
URLController urlConn=新的URLController(Config.allAppsURL);
JsonElement-jelement=new-JsonParser().parse(urlConn.toString());
JsonObject jobject=jeelement.getAsJsonObject();
jobject=jobject.getAsJsonObject(“应用程序列表”);
JsonArray jarray=jobject.getAsJsonArray(“应用程序”);
ArrayList apps=新的ArrayList(){};
for(int i=0;i
我从Web服务调用这个方法,只是为了测试它。我计划在后台使用单独的线程将其拉入


但我做错了什么?这个持久性设置非常混乱

主要问题是
AppController
不是托管对象,因此不会在其中执行依赖项注入。您需要将
AppController
作为托管bean注入servlet,或者使用
javax.persistence.persistence
实用程序类手动初始化
EntityManagerFactory
。如果
AppController
是完全无状态的,则可以使用
@inject
注释将其作为CDI管理的bean注入

如果确实插入AppController,另一个问题是
EntityManagerFactory
仅在构建了
AppController
对象之后才被注入,但字段在对象构建过程中被初始化。创建新的AppController对象时,
emf
字段初始化为null,因此尝试初始化
em
字段将导致null指针异常

EntityManager也不是线程安全的,因此如果您确实要通过CDI注入它,则需要在
updateAppList()
方法中从工厂创建
EntityManager
。这有一个缺点,即事务管理和关闭实体管理器将由您自己负责


另一种方法是将
AppController
转换为EJB无状态会话bean,然后将其注入servlet。在这种情况下,您不需要注入EntityManager工厂,但可以使用
@PersistenceContext
注释直接注入
EntityManager

你用的是什么容器?