试图了解Java EE
(ORM / Entities / Annotations / EJB / Servlets等)。所以我创建了一个非常简单的网页,您可以在其中输入用户信息并将其发送到服务器。我使用Apache Tomcat 8.0
作为webbserver应用程序,这里是持久化实体所需的应用程序文件和内容的所有相关部分:
该应用程序在第99行给出了错误说:
08-Apr-2014 16:18:10.329 SEVERE [http-nio-8084-exec-93] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [indexServlet] in context with path [/JavaEENackademin] threw exception
java.lang.NullPointerException
我做错了什么?数据库存在正确的命名表和列名。但话说回来这不是问题,也许在解决这个问题后它会成为一个问题:)
答案 0 :(得分:1)
您的代码的一个问题是您不应该将EntityManager
注入servlet。 Servlet通常是单例,因此所有servlet都使用相同的EntityManager
。您应该注入一个EntityManagerFactory
,然后从中获取EntityManager
。您还必须处理交易。不确定这是否会引起您的问题,但是应该修复一些问题。
答案 1 :(得分:0)
我很惊讶您能够在您的pastebin中部署代码。特别是:
@WebServlet(name = "indexServlet", urlPatterns = {"/indexServlet"})
public class indexServlet extends HttpServlet {
@Inject
LoginValidation validation;
@PersistenceContext(unitName = "JavaEENackademinPU")
private EntityManager em;
//... offending line 99 calls: em.persist()
}
PersistenceContext
和Inject
都不是servlet规范的一部分,因此您可能会在安装中添加其他jar。
但是您将persistence.xml
配置为使用servlet环境中几乎不支持的JTA事务,可能导致tomcat完全忽略@PersistenceContext
注释并保留em == null
(默认值)
我发现this link描述了一个集成,但它看起来很复杂,需要编辑内部xml文件,然后继续使用Spring。对于初学者来说,可能每一部分都是过度的。
我建议您重新开始使用TomEE的副本,该副本已经完成所有连接,以便为您提供支持CDI(@Inject
)和JPA(@PersistenceContext
)的完全成熟的应用程序服务器开箱即用。