Jestem bardzo zdezorientowany, to jest mój problem:
Mam jtable w pliku jsp, który łączy się zSerwlet. Do tego punktu wszystko jest w porządku. W moim Servletie muszę połączyć się z DB przez EntityManager, ale nie mogę go używać, ponieważ daje mi NullPointerException.Mam HomeController gdzie zarządzam EntityManager bez żadnych problemów, ale nie mogę używać ich funkcji z mojego Servlet. To jest mój kod źródłowy:
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);
}
}
}
}
}
Nie mogę załadować danych z żadnej, żadnej sugestii? Myślę, że jest to oczywisty problem, ale nie mogę tego zrozumieć.
Odpowiedzi:
2 dla odpowiedzi № 1Problem polega na tym, że (w przeciwieństwie do HomeContoller) serwlet nie jest (i nigdy nie będzie) Spring Managed Bean i dlatego EntityManager nigdy nie zostanie wstrzyknięty.
Wygląda na to, że używasz Spring MVC Isugerowałoby zastąpienie serwletu kontrolerem Spring MVC, który wyglądałby jak poniżej. W przeciwnym razie musisz zbadać strategie uzyskania odniesienia do Spring Managed Bean (EntityManager) w 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;
}
}
}
}