【发布时间】:2021-02-13 14:11:35
【问题描述】:
我搜索了类似的主题。这种问题有很多情况,但没有一个完全是我的,也没有一个提供帮助。我现在完全被困住了,所以我非常感谢你的帮助。情况如下:
我正在尝试构建一个非常简单的应用程序,目前只是尝试将所有内容连接在一起。我的配置文件如下: pom.xml(包含便于部署的配置文件):
<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>org.example</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>fish.payara.extras</groupId>
<artifactId>payara-embedded-all</artifactId>
<version>5.182</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>hello</finalName>
</build>
<profiles>
<profile>
<id>payara</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>fish.payara.maven.plugins</groupId>
<artifactId>payara-micro-maven-plugin</artifactId>
<version>1.0.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>bundle</goal>
</goals>
</execution>
</executions>
<configuration>
<useUberJar>true</useUberJar>
<deployWar>true</deployWar>
<payaraVersion>5.182</payaraVersion>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
</project>
我的 web.xml(在 webapp/WEB-INF 下):
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<data-source>
<name>java:global/hello</name>
<class-name>com.mysql.jdbc.Driver</class-name>
<url>jdbc:mysql://localhost:3306/connectiondatabase</url>
<user>root</user>
<password>mypass</password>
</data-source>
</web-app>
该数据库运行正常,并且可以从通用数据库客户端(dbeaver)完美访问。
最后,我的 persistence.xml(在资源/META-INF 下):
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1">
<persistence-unit name="hello" transaction-type="JTA">
<jta-data-source>java:global/hello</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
</properties>
</persistence-unit>
</persistence>
我有一个简单的 ping 资源和 JAXRS 配置类,这是我用来创建项目 (airhacks) 的默认架构类型和一个更简单的实体,如下所示:
package com.airhacks.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@Table(name = "players")
@NamedQuery(name = Player.FIND_PLAYER_BY_NAME, query = "select player from Player player where player.name =:" + Player.PLAYER_PARAMETER)
public class Player {
public static final String PLAYER_PARAMETER = "Player.name";
public static final String FIND_PLAYER_BY_NAME = "Player.findByName";
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
此时,我可以毫无错误地部署应用程序(mvn clean package payara-micro:start),尽管在检查数据库时,没有创建表(我认为持久性单元会同时处理这两个问题) exclude-unlisted-classes' 和 'drop-and-create',但显然还需要其他东西)。
之后,出于测试目的,我添加了一个 queryService 类,因此我可以实际使用我的数据源。 我正在添加以下课程:
package com.airhacks.services;
import com.airhacks.entities.Player;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
@Stateless
public class QueryService {
@PersistenceContext(unitName = "hello")
EntityManager entityManager;
public Player getPlayerByName(String name) {
try {
return entityManager.createNamedQuery(Player.FIND_PLAYER_BY_NAME, Player.class)
.setParameter(Player.PLAYER_PARAMETER, name)
.getSingleResult();
} catch (NoResultException | NonUniqueResultException e) {
return null;
}
}
}
据我了解,没有必要在 PersistenceContext 注释上详细说明其他任何内容,因为我们只有一个持久性单元(尽管我还添加了 unitName="hello",结果相同)。但是,一旦我尝试部署该应用程序,就会出现以下错误:
[2021-02-13T13:50:07.023+0000] [] [严重] [NCLS-CORE-00026] [javax.enterprise.system.core] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1613224207023] [levelValue: 1000] [[ 期间异常 生命周期处理 javax.persistence.PersistenceException: 异常 [EclipseLink-4002](Eclipse 持久性服务 - 2.7.1.qualifier): org.eclipse.persistence.exceptions.DatabaseException 内部 异常:java.sql.SQLException:分配连接时出错。 原因:驱动无法加载:com.mysql.jdbc.Driver Error 代码:0 ...
- 2.7.1.qualifier):org.eclipse.persistence.exceptions.DatabaseException 内部 异常:java.sql.SQLException:分配连接时出错。 原因:驱动无法加载:com.mysql.jdbc.Driver Error 代码:0 在 org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:316) ... ... 41 更多原因:java.sql.SQLException:分配连接时出错。原因:无法加载驱动程序: com.mysql.jdbc.Driver ... com.sun.appserv.connectors.internal.api.PoolingException:
所以,基本上,说明无法加载驱动程序。 这是我无能为力的地方。我的外部库确实包含 mysql,所以我不明白这个问题来自哪里。我已经尝试过使用不同的数据库(例如 SQLite),但是我遇到了同样的问题,当然,使用不同的驱动程序。 非常感谢您的帮助,并对这篇长篇文章感到抱歉。 谢谢!
【问题讨论】: