我是JSP的新手,我试图开发一个简单的程序来测试我到目前为止学到的东西 我所做的是一个使用Bean的JSP页面,并尝试使用用户提供的信息来保存实体。 Web应用程序部署在glassfish4服务器上
实体是一个带有setter和getter的简单User.java类(我可以在servlet中使用它,所以应该有任何问题)。
Bean是以下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)
答案 0 :(得分:0)
当您使用jsp:useBean时,servlet容器在请求/会话/ servlet上下文中查找具有该名称(或类型)的bean。如果找不到,它将实例化一个。 即使您将其声明为SessionBean,您的bean也不在这些上下文中,它位于EJB容器中。因此,您从JSP引用的是该类的简单实例,而不是实际的EJB。因此,依赖注入机制不起作用,因此EntityManager变量为null。 您应该查找EJB以获取正确的EJB实例(完成所有DI)或使用CDI。