我寻找类似的话题。有很多这样的问题,但没有一个完全是我的,也没有提供帮助。我现在完全被困住了,所以我真的很感激你的帮助。情况如下:
我正在尝试构建一个非常简单的应用程序,目前,我只是尝试将所有的东西连接在一起。我的配置文件如下: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下):
<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>这个数据库运行正常,并且可以从一般的db客户端(dbeaver)完美地访问它。
最后,我的persistence.xml (在resources/META下):
<?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配置类,它与我用来创建项目(Airhack)的原型一样默认,并且只是另一个简单的实体,如下所示:
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干净包payara-micro:start),尽管在检查数据库时没有创建任何表(我认为persistence-unit会通过“排除-未列出的类”和“drop-和-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",结果相同)。但是,一旦我尝试部署这个应用程序,我就会得到以下错误:
org.eclipse.persistence.exceptions.DatabaseException 2021-02-13T13:50:07.023+0000严重javax.enterprise.system.core timeMillis: 1613224207023 [生命周期处理中的异常: javax.persistence.PersistenceException: javax.persistence.PersistenceException:javax.persistence.PersistenceException内部异常: java.sql.SQLException:在分配连接时出错。原因:无法加载驱动程序: com.mysql.jdbc.Driver错误代码:0
所以,基本上说,不能加载驱动程序。这是我做不了的地方。我的外部库确实包含mysql,所以我不知道这个问题是从何而来的。我已经尝试过使用不同的db (例如,SQLite),但是我遇到了同样的问题,当然,不同的驱动程序也有相同的问题。会非常感谢你的帮助,并为长期的职位感到抱歉。谢谢!

发布于 2021-02-13 15:48:46
此版本的Mysql使用另一个驱动程序类,将您的web.xml更改为:
<class-name>com.mysql.jdbc.Driver</class-name>至:
<class-name>com.mysql.cj.jdbc.MysqlConnectionPoolDataSource</class-name>https://stackoverflow.com/questions/66186046
复制相似问题