【发布时间】:2015-12-08 21:16:44
【问题描述】:
我正在做一个项目: Web 动态项目 + JPA 2.1 / EclipseLink 2.5.2 雄猫 8.0.28 / JRE 1.8.0_66 日食月神
当在一个简单的 JPA 项目中作为 Java 应用程序执行时,项目的 JPA 部分运行良好。 我没有对那部分代码做任何改动。
我想在 JSP 中打印一些请求结果。我生成了一个 servlet 并尝试打印已在数据库中创建的用户名。几个小时以来,我遇到了关于 JDBC 驱动程序和persistence.xml 的错误,但没有找到。
为了解决依赖问题,我添加了 Maven。
现在,我的用户打印在 JSP 中,这很好,但是我之前使用的“Run.java”类不再工作了。
在将我的应用程序作为“Java 应用程序”运行时遇到的错误让我感到很困惑:
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.<clinit>(EntityManagerFactoryProvider.java:55)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:92)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:188)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at dao.LayerDAO.<init>(LayerDAO.java:16)
at exec.Run.main(Run.java:18)
Caused by: java.lang.NullPointerException
at org.eclipse.persistence.platform.server.NoServerPlatformDetector.checkPlatform(NoServerPlatformDetector.java:28)
at org.eclipse.persistence.platform.server.ServerPlatformUtils.detectServerPlatform(ServerPlatformUtils.java:58)
at org.eclipse.persistence.internal.jpa.IsolatedHashMap.<clinit>(IsolatedHashMap.java:48)
... 7 more
很明显,当我在 DAO 类中创建 EntityManagerFactory 时会发生错误(与使用 JSP 的相同)。
这是我的 POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>CitizenWeb</groupId>
<artifactId>com.citizenweb</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>src</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<!-- Generic properties -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Web -->
<jsp.version>2.2</jsp.version>
<jstl.version>1.2</jstl.version>
<servlet.version>2.5</servlet.version>
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
<!-- Test -->
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<!-- Other Web dependencies -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<!-- Logging with SLF4J & LogBack -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
<!-- EclipseLink -->
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.core</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.jpa</artifactId>
<version>2.5.2</version>
</dependency>
<!-- MySQL DB -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
</dependencies>
</project>
如果需要,这是我的 persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="CitizenWeb" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<mapping-file>META-INF/orm.xml</mapping-file>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/citizen"/>
<property name="javax.persistence.jdbc.user" value="user"/>
<property name="javax.persistence.jdbc.password" value="user"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
</properties>
</persistence-unit>
</persistence>
实体映射由 orm.xml 管理
这里也是 DAO 类的开始:
package dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.Query;
import entities.Address;
import entities.GroupAssoc;
import entities.RightsGranted;
import entities.User;
public class LayerDAO implements IFLayerDAOLocal {
EntityManager em = Persistence.createEntityManagerFactory("CitizenWeb").createEntityManager();
public void createUser(User user) {
System.out.println("DAO > addUser > "+em.hashCode());
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();
}
这里没有任何改变,persistence.xml 中也没有
由于项目性质的变化(JPA -> Web Dynamic+JPA),“唯一”的变化是在 build.path 中。 maven已经解决了webserver和mysql连接器的问题,但是现在app端坏了。
你看到了什么我没有看到的东西吗?
谢谢。
【问题讨论】:
-
奇怪,我认为这是 EclipseLink 2.6.1 特有的问题。你说应用程序实际上完全出错了?升级到最新的 EclipseLink 可能值得一试。在最近的版本中,这已最小化为仅记录异常,没有崩溃。相关bug链接:bugs.eclipse.org/bugs/show_bug.cgi?id=463629
-
好吧,我觉得这看起来很眼熟。 stackoverflow.com/questions/34085811/… 。显然,自从您上次迭代此问题以来,事情再次走下坡路。
-
是的,我记得你告诉我的关于 EclipseLink 2.6.1 的内容,这就是我强制使用 2.5.2 版本的原因 :) 你看,我听你的 ^^ 是的,我有一个运行。 java 类,以便轻松操作我的读写操作:添加用户、删除它们等。与 DB 的所有操作都由 LayerDAO.class 处理。 LayerDAO 工作正常,因为它将我的用户数据打印到 JSP 页面中。 Run.java 的相同处理导致我出现此错误。
-
嗯,我第一次遇到这个问题时,是在尝试使用 Glassfish。但我绝对没有成功使用它。在项目的目标运行时中,我将 Glassfish 更改为默认 JRE (1.8.0_66) 并开始工作。但我需要一个网络服务器。所以这次我尝试了Tomcat,正如你所说,事情再次走下坡路。我试图用 2.6.1 EclipseLink 版本更改 2.5.2,它适用于我的 JSP。但是 java Run 类仍然卡在
错误。
标签: java maven jpa persistence tomcat8