#jsp #jakarta-ee #jpa #javabeans
#jsp #джакарта-ee #jpa #javabeans
Вопрос:
Я совершенно новичок в JSP, и я попытался разработать простую программу для проверки того, что я узнал до сих пор.
То, что я сделал, — это страница JSP, которая использует компонент и пытается сохранить сущность с информацией, предоставленной пользователем. Веб-приложение развернуто на сервере glassfish4
Сущность представляет собой простой User.java класс с установщиками и получателями (я могу использовать его в сервлете, так что с этим не должно быть никаких проблем).
Компонент следующий UserEJB.java класс
@LocalBean
@Stateless
public class UserEJB implements Serializable {
@PersistenceContext(unitName="scuoleSciPU")
private EntityManager em;
public List<Request> findUsers() {
Query query = em.createNamedQuery("findAllUsers");
return query.getResultList();
}
public User createUser(User user) {
em.persist(user); <-- here is where NullPointer is throw
return user;
}
}
Страница JSP — это следующая страница, на которую пользователь перенаправляется после отправки формы.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="userEjb" type="com.storassa.javaee.scuolesci.UserEJB" class="com.storassa.javaee.scuolesci.UserEJB"
scope="session">
</jsp:useBean>
<%@ page import="com.storassa.javaee.scuolesci.User" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Successful registration</title>
</head>
<BODY>
<h1>You have successfully registered to this website</h1>
<%
User user = new User();
user.setEmail((String)request.getParameter("email"));
user.setName((String)request.getParameter("name"));
user.setSurname((String)request.getParameter("surname"));
user.setPassword((String)request.getParameter("password"));
user.setYearOfBirth(Integer.parseInt((String)request.getParameter("yearOfBirth")));
userEjb.createUser(user);
session.setAttribute("logged", "true");
session.setAttribute("name", user.getName());%>
<a href="carousel.jsp"><h3>Return to main page</h3></a>
</BODY>
</html>
При загрузке страницы JSP выдается исключение NullPointerException (в em.persist(), как описано в приведенном выше коде). Это полный стек ошибок
StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at com.storassa.javaee.scuolesci.UserEJB.createUser(UserEJB.java:32)
at org.apache.jsp.registered_jsp._jspService(registered_jsp.java:73)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:745)
Комментарии:
1. где вы инициализировали EntityManager?
2. Я использовал инъекцию с аннотацией @PersistenceContext. Я использовал тот же механизм для сохранения других объектов в сервлетах, и он отлично работает
3. Не используйте jsp:useBean. Он старый, устаревший, сбивающий с толку и, несомненно, работает не так, как вы думаете.
4. И поскольку вы все равно используете скриплеты, вы всегда можете извлечь компонент из сеанса с
session.getAttribute
помощью : no need to jsp:useBean5. Я не понимаю вашего последнего комментария. Для первого я взял в качестве ссылки книгу, написанную в 2012 году, где указан useBean . Почему вы говорите, что он устарел?
Ответ №1:
При использовании jsp:useBean контейнер сервлета ищет компонент с этим именем (или типом) в контекстах запроса / сеанса / сервлета. Если он не найдет его, он создаст его экземпляр. Ваш компонент, даже если вы объявили его как SessionBean, не находится ни в одном из этих контекстов, он находится в контейнере EJB. Итак, то, на что вы ссылаетесь из JSP, является простым экземпляром этого класса, а не фактическим EJB. Как следствие, механизм внедрения зависимостей не сработал, поэтому переменная EntityManager имеет значение null. Вы должны выполнить поиск EJB, чтобы получить правильный экземпляр EJB (со всеми выполненными DI) или использовать CDI.
Комментарии:
1. Не могли бы вы предоставить мне пример для поиска или для CDI?