/ / Usando o EntityManager em um Servlet para um Jtable - spring, servlets, jpa

Usando o EntityManager em um Servlet para um Jtable - spring, servlets, jpa

Estou muito confuso. Esse é o meu problema:

Eu tenho um jtable em um arquivo jsp que se conecta comum servlet. Até aqui tudo está bem. No meu Servlet eu preciso conectar a um banco de dados através de EntityManager, mas eu não posso usá-lo porque me dá NullPointerException.Eu tenho um HomeController onde eu gerencie EntityManager sem problemas, mas eu não posso usar suas funções do meu Servlet. Este é o meu código fonte:

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);
}

}
}
}

}

Eu não posso carregar dados de qualquer maneira, qualquer sugestão? Eu acho que é um problema óbvio, mas eu não consigo entender isso.

Respostas:

2 para resposta № 1

O problema é que (ao contrário do HomeContoller) o Servlet não é (e nunca será) um Spring Managed Bean e, portanto, o EntityManager nunca será injetado.

Como você parece já estar usando o Spring MVC Isugeriria substituir o Servlet por um controlador Spring MVC que seria parecido com o abaixo. Caso contrário, você precisará investigar estratégias para obter uma referência a um Spring Managed Bean (EntityManager) em um Servlet.

@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;
}
}
}
}