Java Tomcat上下文资源不会加载h2驱动程序

Java Tomcat上下文资源不会加载h2驱动程序,java,tomcat,h2,resteasy,jooq,Java,Tomcat,H2,Resteasy,Jooq,设置 我正在使用RESTEasy构建一个Java RESTService,ApacheShiro用于安全性,jOOQ作为我的ORM。我希望tomcat创建一个资源,处理连接 当我启动TomcatTomcat8.5,而不是EE版本只是常规版本时,我没有得到任何错误。当我转到/api/message时,我执行下面的代码getMessage 执行失败的代码 这确实管用!所以问题真正在于让tomcat加载驱动程序。与我的pom设置或应用程序中的类路径不同,h2 jar也位于WEB-INF/lib中 Po

设置 我正在使用RESTEasy构建一个Java RESTService,ApacheShiro用于安全性,jOOQ作为我的ORM。我希望tomcat创建一个资源,处理连接

当我启动TomcatTomcat8.5,而不是EE版本只是常规版本时,我没有得到任何错误。当我转到/api/message时,我执行下面的代码getMessage

执行失败的代码

这确实管用!所以问题真正在于让tomcat加载驱动程序。与我的pom设置或应用程序中的类路径不同,h2 jar也位于WEB-INF/lib中

Pom.xml

Web.xml

Context.xml

我没有得到的东西
首先,我不明白为什么@Resource不适用于数据源。另外,我不明白为什么我的h2驱动程序没有加载。在java代码中,我可以毫无问题地创建新的连接,但在tomcat中我不能。

我的英雄!我显然没有注意到。你知道为什么@Resource不起作用吗?你在用Jersey吗?如果是这样,我认为您需要在POM中添加另一个库,以便@Resource工作。我不记得是哪一个了。您仍然可以用老式的方式来做:`try{Context initCtx=new InitialContext;Context envCtx=Context initCtx.lookup java:comp/env;dataSource=dataSource envCtx.lookup jdbc/myDatasource;}catch NamingException ex{throw new RuntimeExceptionex;}`
java.sql.SQLException: Cannot load JDBC driver class 'com.h2.Driver'
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2145)
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2037)
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543)
at com.apon.MessageService.getMessage(MessageService.java:68)
@Resource(name = "jdbc/TestingRest-db")
DataSource dataSource;
@GET
@Produces(MediaType.APPLICATION_JSON)
@RequiresUser
public List<MessagePojo> getMessage() {
    InitialContext initCtx = null;
    try {
        initCtx = new InitialContext();
        Context envCtx = (Context) initCtx.lookup("java:comp/env");

        DataSource ds = (DataSource) envCtx.lookup("jdbc/TestingRest-db");
        if (dataSource == null) {
            // This will always be executed, because it doesn't fill the resource??
            dataSource = ds;
        }
    } catch (NamingException e) {
        e.printStackTrace();
        return null;
    }
    try {
        // This line doesn't really help.
        Class.forName("org.h2.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    List<MessagePojo> list = new ArrayList();
    try {
        Connection connection = dataSource.getConnection();
        messageMyDao = new MessageMyDao(DSL.using(connection, JDBCUtils.dialect(connection)).configuration());
        list = messageMyDao.findAll();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    return list;
}
// Load h2 driver on the classpath. If you do not do this, getConnection will fail.
    try {
        Class.forName("org.h2.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    // The following connection works perfectly fine.
    connection = DriverManager.getConnection(url, userName, password);
<properties>
    <resteasy.version>3.1.4.Final</resteasy.version>
    <apache.shiro.version>1.3.2</apache.shiro.version>
    <apache.log4j.version>2.9.1</apache.log4j.version>
    <jooq.version>3.10.2</jooq.version>
</properties>
<dependencies>
    <!-- RESTService framework: RESTEasy -->
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>${resteasy.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
        <version>${resteasy.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-servlet-initializer</artifactId>
        <version>${resteasy.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson2-provider</artifactId>
        <version>3.1.4.Final</version>
    </dependency>

    <!-- Security framework: Apache Shiro -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>${apache.shiro.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>${apache.shiro.version}</version>
    </dependency>

    <!-- Use jOOQ as ORM. -->
    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq</artifactId>
        <version>${jooq.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-meta</artifactId>
        <version>${jooq.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-codegen</artifactId>
        <version>${jooq.version}</version>
    </dependency>
    <!-- H2 database -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.196</version>
    </dependency>
<listener>
    <listener-class>org.h2.server.web.DbStarter</listener-class>
</listener>
<listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/api/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

<resource-ref>
    <res-ref-name>jdbc/TestingRest-db</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <injection-target>
        <injection-target-class>com.MessageService</injection-target-class>
        <injection-target-name>dataSource</injection-target-name>
    </injection-target>
</resource-ref>
  <Resource name="jdbc/TestingRest-db" auth="Container" type="javax.sql.DataSource"
           maxTotal="100" maxIdle="30" maxWaitMillis="10000"
           driverClassName="com.h2.Driver"
           url="jdbc:jdbc:mysql:file:./TestingRest-db"/>