2014-12-24 20 views
1

我很困惑。這是我的問題:在Jtable的Servlet中使用EntityManager

我有一個jtable在一個與Servlet連接的jsp文件。到此爲止,一切都很好。在我的Servlet中,我需要通過EntityManager連接到數據庫,但我無法使用它,因爲它給了我NullPointerException。我有一個HomeController,我沒有任何問題管理EntityManager,但是我不能從我的Servlet中使用它們的函數。這是我的源代碼:

HomeController.java

@Controller 
public class HomeController { 

private static final Logger logger = LoggerFactory 
     .getLogger(HomeController.class); 

@PersistenceContext 
private EntityManager entityManager; 

(...) 

/** 
* Lists users by points in desc order 
* 
* @return list with users ordered by points 
*/ 
public List<Usuario> listaUsuarios() { 
    return entityManager.createQuery(
      "select u from Usuario u order by puntos desc").getResultList(); 
} 
} 

InvasionServlet.java

@WebServlet("/InvasionServlet") 
public class InvasionServlet extends HttpServlet { 

private static final long serialVersionUID = -9049034342389418838L; 

private static final Logger logger = LoggerFactory 
     .getLogger(InvasionServlet.class); 

@PersistenceContext 
private EntityManager entityManager; 

/* Manejo de tablas */ 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    String action = request.getParameter("action"); 
    if (action != null) { 
     Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
     response.setContentType("application/json"); 
     if (action.equals("list")) { 

      logger.info("loading users list"); 

      List<Usuario> usuariosOrdenados = entityManager.createQuery(
        "select u from Usuario u order by puntos desc").getResultList(); 
      JsonElement element = gson.toJsonTree(usuariosOrdenados, 
        new TypeToken<List<Usuario>>() { 
        }.getType()); 
      JsonArray jsonArray = element.getAsJsonArray(); 
      String listData = jsonArray.toString(); 
      // Return Json in the format required by jTable plugin 
      listData = "{\"Result\":\"OK\",\"Records\":" + listData + "}"; 
      try { 
       response.getWriter().print(listData); 
      } catch (IOException e) { 
       String error = "{\"Result\":\"ERROR\",\"Message\":" 
         + e.getStackTrace() + "}"; 
       response.getWriter().print(error); 
      } 

     } 
    } 
} 

}

我無法從反正加載數據,任何建議?我認爲這是一個明顯的問題,但我無法想象。

回答

2

問題是(與HomeContoller不同)Servlet不是(也不會是)Spring Managed Bean,因此EntityManager將永遠不會被注入。

因爲你似乎已經在使用Spring MVC,所以我建議用一個Spring MVC控制器來替換Servlet,它看起來像下面這樣。否則,您需要研究在Servlet中獲取對Spring Managed Bean(EntityManager)的引用的策略。

@Controller 
public class MyController(){ 

    @PersistenceContext 
    private EntityManager entityManager; 

    @ResponseBody 
    @RequestMapping(path="pathToBeCalled") 
    public String loadData(@RequestParam("action") String action){ 

     if (action != null) { 
      Gson gson = new GsonBuilder().setPrettyPrinting().create(); 

      if (action.equals("list")) { 

       logger.info("loading users list"); 

       List<Usuario> usuariosOrdenados = entityManager.createQuery(
         "select u from Usuario u order by puntos desc").getResultList(); 

       JsonElement element = gson.toJsonTree(usuariosOrdenados, 
         new TypeToken<List<Usuario>>() { 
         }.getType()); 
       JsonArray jsonArray = element.getAsJsonArray(); 
       String listData = jsonArray.toString(); 

       listData = "{\"Result\":\"OK\",\"Records\":" + listData + "}"; 

       return listData; 
      } 
     } 
    } 
} 
+0

Thnkx!它的工作原理:) – aSoler

+0

從這個意義上說,由'@ Service'(或'@ Repository',由'org.springframework.stereotype'包裝)裝飾的Spring服務就足夠了。不應該嗎? – Tiny