首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体管理器在使用JPA连接到Java中的Dockerised DB2时为空,也使用maven & Open Open

实体管理器在使用JPA连接到Java中的Dockerised DB2时为空,也使用maven & Open Open
EN

Stack Overflow用户
提问于 2021-10-29 01:36:18
回答 1查看 597关注 0票数 0

因此,我正在开发一个API,并试图使用JPA实体管理器从java连接到DB2的本地坞实例。在运行Apache并获得构建成功之后,我尝试从Postman获得一个GET请求来测试端点,并从DB2获得所有用户的列表。我收到以下错误,即实体管理器为null。我试过在网上进行研究,但似乎找不到解决办法。Dao类与以前使用Derby而不是DB2的迭代几乎没有变化,而且运行良好。我想知道我哪里出了问题,什么地方需要改变,如果不需要什么。下面提供的是xml文件和包含实体管理器的DAO java类。DB2的所有属性都是正确的,因为它们与我从中成功实现的连接保持不变。当时使用的驱动程序是db2jcc4,我认为它不同于用于maven依赖项的驱动程序,因此不确定这是否是一个问题。

邮差:

因为“"javax.persistence.EntityManager.createNamedQuery(String,”是空的,所以

错误500: java.lang.NullPointerException:无法调用java.lang.Class)

Maven:

org.eclipse.persistence.jpa.PersistenceProvider信息提供程序:当它试图为jpa单元持久性单元创建容器实体管理器工厂时,

持久化提供程序发生了错误。发生以下错误:异常EclipseLink-28018EclipseLink-28018信息异常描述: PersistenceUnit jpa的预部署失败。信息内部异常: javax.persistence.PersistenceException: CWWJP0013E:服务器无法找到jpa单元持久性单元的java:comp/DefaultDataSource数据源,因为它遇到了以下异常: javax.naming.NameNotFoundException: comp/DefaultDataSource。

pom.xml

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
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();
    }

}

版本:

11.5.6

  • Maven:
  • docker : 20.10.8,构建3967b7
  • DB2: ibm/db2
  • 映像版本 3.8.3
    • Java: JDK 14.0.2

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-29 08:33:50

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

如下所示:

代码语言:javascript
复制
<?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>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69762671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档