Java EntityManager空指针
我试图检索一个简单的JSON列表,将这个JSON数组转换为Eclipselink对象,并将它们放在postgres中。尽管我一直从EntityManager获取空指针,但我已经迷失了方向 我正在从测试Web服务调用我的控制器: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
@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
你用的是什么容器?