尝试使用JPA(也使用maven和Open Liberty)连接到Java中的Dockerised DB2时,实体管理器为空

4c8rllxm  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(126)

因此我正在开发一个API,并尝试使用JPA实体管理器从java连接到DB2的本地Docker示例。我尝试了一个来自Postman的GET请求来测试一个端点,并从DB2中获取所有用户的列表。我收到了下面的错误消息,说实体管理器为空。我试着在线搜索,似乎找不到解决方案。Dao类实际上与以前使用Derby而不是DB2的迭代相比没有什么变化,下面提供的是xml文件和包含实体管理器的DAO java类。DB2的所有属性都正确,因为它们“我在Eclipse的数据库开发中成功地连接了,但没有改变。当时使用的驱动程序是db2 jcc 4,我认为它与据说用于maven依赖项的驱动程序不同,所以不确定这是否是一个问题。
Postman :
错误500:Java.lang.空指针异常:无法调用“javax.persistence.EntityManager.createNamedQuery(字符串,java.lang.Class),”因为“this.em”为空
玛文:
[信息] [错误] CWWJP 0015 E:org.eclipse.persistence.jpa.PersistenceProvider持久性提供程序在尝试为jpa单元持久性单元创建容器实体管理器工厂时出错。出现以下错误:异常错误[Eclipse链接-28018](Eclipse持久性服务- 2.7.9.v20210604- 2c 549 e2208):实体管理器设置异常
[INFO]异常描述:预部署持久性单元[jpa-unit]失败。
[INFO]内部异常:javax.persistence.PersistenceException:CWWJP0013E:服务器找不到jpa单元持久性单元的java:comp/DefaultDataSource数据源,因为它遇到了以下异常:javax.naming.NameNotFoundException:javax.naming.NameNotFoundException:java:组件/默认数据源。
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.obdoblock</groupId>
  <artifactId>hyperledger-api</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <!-- Liberty configuration -->
        <liberty.var.default.http.port>3500</liberty.var.default.http.port>
        <liberty.var.default.https.port>9443</liberty.var.default.https.port>
        <liberty.var.app.context.root>api</liberty.var.app.context.root>
        <!-- TestDB Configuration -->
        <version.ibm.db2>11.5.6.0</version.ibm.db2>
    </properties>

    <dependencies>
        <!-- Provided dependencies -->
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-api</artifactId>
            <version>8.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.microprofile</groupId>
            <artifactId>microprofile</artifactId>
            <version>3.3</version>
            <type>pom</type>
            <scope>provided</scope>
        </dependency>
        <!-- For tests -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.6.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-client</artifactId>
            <version>3.3.6</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-extension-providers</artifactId>
            <version>3.3.6</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse</groupId>
            <artifactId>yasson</artifactId>
            <version>1.0.7</version>
            <scope>test</scope>
        </dependency>
        <!-- DB2 connector -->
        <dependency>
            <groupId>com.ibm.db2</groupId>
            <artifactId>jcc</artifactId>
            <version>11.5.6.0</version>
        </dependency>
        <!-- Hyperledger Fabric Gateway for Blockchain -->
        <dependency>
            <groupId>org.hyperledger.fabric</groupId>
            <artifactId>fabric-gateway-java</artifactId>
            <version>2.2.0</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!-- Enable liberty-maven plugin -->
            <plugin>
                <groupId>io.openliberty.tools</groupId>
                <artifactId>liberty-maven-plugin</artifactId>
                <version>3.3.4</version>
                <configuration>
                    <copyDependencies>
                        <location>${project.build.directory}/liberty/wlp/usr/shared/resources</location>
                        <dependency>
                            <groupId>com.ibm.db2</groupId>
                            <artifactId>jcc</artifactId>
                            <version>11.5.6.0</version>
                        </dependency>
                    </copyDependencies>
                </configuration>
            </plugin>
            <!-- Plugin to run functional tests -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <systemPropertyVariables>
                        <http.port>${liberty.var.default.http.port}</http.port>
                        <context.root>${liberty.var.app.context.root}</context.root>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
            </plugin>
            <!-- Plugin to run unit tests -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
            </plugin>
        </plugins>
    </build>
</project>

server.xml

<server description="Obdoblock REST Server">
    <featureManager>
        <feature>jaxrs-2.1</feature>
        <feature>openapi-3.1</feature>
        <feature>jpa-2.2</feature>
        <feature>cdi-2.0</feature>
    </featureManager>

    <httpEndpoint 
        httpPort="${default.http.port}" 
        httpsPort="${default.https.port}"
        id="defaultHttpEndpoint" 
        host="*" 
    />

    <webApplication 
        location="hyperledger-api.war" 
        contextRoot="${app.context.root}"
    />

    <!-- DB2 Library Configuration -->
    <library id="DB2JCCLib">
        <fileset dir="${shared.resource.dir}" includes="*.jar" />
    </library>

    <dataSource jndiName="jdbc/db2">
        <jdbcDriver libraryRef="jdbcLib"/>
        <properties
            databaseName="testdb"
            serverName="localhost" 
            portNumber="50000"
            user="****" password="****"
        />
    </dataSource>
</server>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- TODO: This will have to be configured by ENV as well -->
<!-- https://www.eclipse.org/eclipselink/documentation/2.5/jpa/extensions/p_ddl_generation.htm -->
<persistence version="2.2"
    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_2.xsd">
    <persistence-unit name="jpa-unit" transaction-type="JTA">
        <properties>
            <!-- Connection Specific -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect"/>

            <property name="javax.persistence.jdbc.driver" value="com.ibm.db2.jcc.DB2Driver" />
            <property name="javax.persistence.jdbc.url"    value="jdbc:db2://localhost:50000/testdb" />
            <property name="javax.persistence.jdbc.user" value="****" />
            <property name="javax.persistence.jdbc.password" value="****" />

            <property name="show_sql" value="true"/>
            <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
        </properties>
    </persistence-unit>
</persistence>

UserDao.java

package dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.enterprise.context.RequestScoped;
import models.*;

@RequestScoped
public class UserDao {

    @PersistenceContext(name = "jpa-unit")
    private EntityManager em;

    public void createUser(Users user){
        em.persist(user);
    }

    public Users readUser(int userId){
        return em.find(Users.class, userId);
    }

    public List<Users> readAllUsers(){
        return em.createNamedQuery("Users.findAll", Users.class).getResultList();
    }

    public void updateUser(Users user){
        em.merge(user);
    }

    public void deleteUser(Users userId){
        em.remove(userId);
    }

    public List<Users> findUser(String email){
        return em.createNamedQuery("Users.findUser", Users.class)
            .setParameter("email", email)
            .getResultList(); 
    }

    public void createHistory(History hist){
        em.persist(hist);
    }
    //wait this doesnt do anything? 
    public Users readHistory(int id){
        return em.find(Users.class, id);
    }

    public List<History> readAllHistory(){
        return em.createNamedQuery("History.findAll", History.class).getResultList();
    }

}

版本:

  • 扩展坞:20.10.8,内部版本号3967 b7 d
  • DB2:ibm/db2 docker映像版本11.5.6
  • 美芬:3.8.3
  • Java语言:JDK 14.0.2

如果需要更多的细节,我很乐意提供。谢谢,迪伦

cyej8jka

cyej8jka1#

您的persistence.xml不正确。它应该指向在server.xml中配置的数据源,而不是指定驱动程序属性。
就像这样:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
    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_2.xsd">
    <persistence-unit name="jpa-unit" transaction-type="JTA">
        <jta-data-source>jdbc/guestbookDS</jta-data-source>
        <properties>
            <property name="javax.persistence.schema-generation.database.action" value="create" />
            <property name="javax.persistence.schema-generation.create-database-schemas" value="true" />
            <property name="javax.persistence.schema-generation.scripts.action" value="create" />
            <property name="javax.persistence.schema-generation.scripts.create-target" value="create.ddl"/>  
<!--
            <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
            <property name="eclipselink.ddl-generation.output-mode" value="both" />
            -->
        </properties>
    </persistence-unit>
</persistence>

您可以查看这个非常简单的Liberty项目,它使用JPA和数据库https://github.com/stocktrader-ops/db-sat-demo(它使用PostgreSQL而不是DB2,但您应该使用您的数据源设置)

相关问题