java - 无法让 openJPA 与 Tomcat 8 一起工作

标签 java maven tomcat jpa tomcat8

我试图让 OpenJPA 与 Tomcat 8 一起工作,但一直无法,它抛出错误:

org.apache.openjpa.persistence.ArgumentException: The persistence provider is 
attempting to use properties in the persistence.xml file to resolve the
data source. A Java Database Connectivity (JDBC) driver or data source class name
must be specified in the openjpa.ConnectionDriverName or 
javax.persistence.jdbc.driver property. The following properties 
are available in the configuration: 
"org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl@2655aabb". 

我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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">

...servlet stuff...

    <resource-ref>
        <description>Database</description>
        <res-ref-name>jdbc/webservice</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</web-app>

我的 context.xml (我通过在 servlet 中通过 InitialContext 等进行连接来验证此数据源是否有效):

<?xml version="1.0" encoding="utf-8"?>
<Context>

    <Resource name="jdbc/webservice" auth="Container"

            type="javax.sql.DataSource"

            maxActive="8"

            removeAbandoned="true"
            removeAbandonedTimeout="60"
            logAbandoned="true"

            validationQuery="SELECT 1"

            username="dev" password="mypass"

            url="jdbc:mysql://127.0.0.1:3306/mydb"

            driverClassName="com.mysql.jdbc.Driver">
    </Resource>

    <Resource name="BeanManager"

            auth="Container"

            type="javax.enterprise.inject.spi.BeanManager"

            factory="org.jboss.weld.resources.ManagerObjectFactory"/>

</Context>

我的 persistence.xml(我还尝试了属性和数据源元素的 every diff 组合。我还尝试了“RESOURCE_LOCAL”):

<?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="TestOpenJPAPersistence" transaction-type="JTA">

        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>java:comp/env/jdbc/webservice</jta-data-source>
        <non-jta-data-source>java:comp/env/jdbc/webservice</non-jta-data-source>
<

        <properties>

            <!-- 
                I tried leaving these out, leaving them in and all combinations.
                I also tried it with the jdbc url, username, password in properties too.
            -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
            <property name="openjpa.ConnectionFactoryProperties" value="MaxActive=10,MaxIdle=5,MinIdle=2,MaxWait=1800000"/>
            <property name="openjpa.Log" value="org.apache.openjpa.log, DefaultLevel=DEBUG, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
            <property name="openjpa.DynamicEnhancementAgent" value="false" />
            <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" />
        </properties>

    </persistence-unit>
</persistence>

我的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>groupId</groupId>
    <artifactId>TestWebSocket</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>

    <!-- Tell Maven what language version to use -->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/javax.enterprise/cdi-api -->
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <version>2.0</version>
        </dependency>

        <!-- Enables the annotations, etc needed -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.exterprise</groupId>
                    <artifactId>cdi-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Our jersey libs -->
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>2.25.1</version>
        </dependency>

        <!-- CDI to JAX-RS Binding -->
        <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.containers.glassfish/jersey-gf-cdi-ban-custom-hk2-binding -->
        <dependency>
            <groupId>org.glassfish.jersey.containers.glassfish</groupId>
            <artifactId>jersey-gf-cdi</artifactId>
            <version>2.14</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss.weld.servlet/weld-servlet-core -->
        <dependency>
            <groupId>org.jboss.weld.servlet</groupId>
            <artifactId>weld-servlet-core</artifactId>
            <version>3.0.0.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss.weld/weld-core-impl -->
        <dependency>
            <groupId>org.jboss.weld</groupId>
            <artifactId>weld-core-impl</artifactId>
            <version>3.0.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.apache.openjpa</groupId>
            <artifactId>openjpa</artifactId>
            <version>2.4.2</version>
        </dependency>

    </dependencies>

</project>

我的小服务程序:

package com.testjpa;

import com.testpush.TestEvent;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceUnit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


@WebServlet("/jpa")
public class JPAServlet extends HttpServlet
{
    @PersistenceUnit(unitName = "TestOpenJPAPersistence")
    EntityManagerFactory persistenceFactory;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        EntityManager persistenceManager = null;
        String result = "Not found";
        try
        {
            //I need to do this as otherwise the factory is null
            persistenceFactory = Persistence.createEntityManagerFactory( "TestOpenJPAPersistence" );

            //This line throws the error
            persistenceManager = persistenceFactory.createEntityManager();
            User user = persistenceManager.find( User.class, 9 );
            if ( user != null )
            {
                result = user.getName();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            if ( persistenceManager != null )
            {
                persistenceManager.close();
            }
        }
        resp.getWriter().println( result );
    }
}

最佳答案

查看您的源代码,我发现了问题:您的 persistence.xml 位于 src/main/webapp/META-INF 而不是 src/main/resources/META-INF.

将它移动到 src/main/resources/META-INF 并删除 javax.persistence.jdbc.driver 属性,它就会工作。

关于java - 无法让 openJPA 与 Tomcat 8 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44401165/

相关文章:

java - 在 TextView 中打印数组

java - Java 中的多态性、数据类型和内存

java - 运行 Spring MVC 测试时出现 NoSuchMethod 错误

eclipse - Maven2 : Missing artifact but jars are in place

scala - 在 Maven 生成的包中包含 scala-library.jar

java - 为什么这个 GIF 在使用 Java ImageIO 调整大小时最终变成黑色方 block

java - 在TextureView中添加按钮(Android/Java)

java - 在 Spring Boot 中增加 Tomcat 的连接超时

tomcat - 将我的应用程序日志附加到 tomcat 的日志中

java - 仅在 apache-tomcat-9 和 Java 8 中启用 TLS 1.2