Spring 将JNDI添加到Grails3中的嵌入式Tomcat服务器

Spring 将JNDI添加到Grails3中的嵌入式Tomcat服务器,spring,tomcat,grails,groovy,spring-boot,Spring,Tomcat,Grails,Groovy,Spring Boot,在Grails3.0中运行测试应用程序或运行应用程序时,grails运行自己版本的嵌入式Tomcat服务器。我可以通过以下链接得出结论: 但是,context.xml和server.xml文件是使用下拉库预编译的。当从头开始创建grails应用程序时,我找不到这两个文件中的任何一个。config.groovy也是如此,因为它位于外部库中 我试图将JNDI资源注入容器中,以便调用它们。大概是这样的: <Resource name="myDatasourceName" auth="Contai

在Grails3.0中运行测试应用程序或运行应用程序时,grails运行自己版本的嵌入式Tomcat服务器。我可以通过以下链接得出结论:

但是,context.xml和server.xml文件是使用下拉库预编译的。当从头开始创建grails应用程序时,我找不到这两个文件中的任何一个。config.groovy也是如此,因为它位于外部库中

我试图将JNDI资源注入容器中,以便调用它们。大概是这样的:

<Resource name="myDatasourceName" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="root" password="password" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/my_db_name"/>
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
    tomcat.enableNaming();
    TomcatEmbeddedServletContainer container =
    super.getTomcatEmbeddedServletContainer(tomcat);
    for (Container child: container.getTomcat().getHost().findChildren()) {
        if (child instanceof Context) {
            ClassLoader contextClassLoader =((Context)child).getLoader().getClassLoader();
            Thread.currentThread().setContextClassLoader(contextClassLoader);
            break;
        }
    }
    return container;
}
我在我的服务文件中这样调用此源:

public DataSource getOneSource() {
    Context context = (Context) new InitialContext().lookup("java:/comp/env")
        oneSource= (DataSource) context.lookup("jdbc/oneSource")
    return oneSource
}    
但我得到了一个错误,说明:

javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp].

以前有人这样做过吗?如果有一个额外的线程正在覆盖上下文,我不会感到惊讶。

在Grails 3中,您可以这样做:

通常,在GrailsWeb应用程序中,这在
/Grails-app/init/Application.groovy

(在我的例子中,我注释掉了
jndiDataSource()
部分,只使用了
postProcessContext()


来源:

在Grails3中,您可以这样做:

通常,在GrailsWeb应用程序中,这在
/Grails-app/init/Application.groovy

(在我的例子中,我注释掉了
jndiDataSource()
部分,只使用了
postProcessContext()


来源:

此问题的解决方案分两步解决。首先,我必须使用儿童方法来设置正确的上下文,在这个问题中可以找到

正如所想象的那样,我当时唯一需要做的更改是getTomcatEmbeddedServletContainer方法。我对原稿进行了如下编辑:

<Resource name="myDatasourceName" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="root" password="password" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/my_db_name"/>
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
    tomcat.enableNaming();
    TomcatEmbeddedServletContainer container =
    super.getTomcatEmbeddedServletContainer(tomcat);
    for (Container child: container.getTomcat().getHost().findChildren()) {
        if (child instanceof Context) {
            ClassLoader contextClassLoader =((Context)child).getLoader().getClassLoader();
            Thread.currentThread().setContextClassLoader(contextClassLoader);
            break;
        }
    }
    return container;
}
接下来,我必须编辑gradle构建文件,以包含dbcp源依赖项。我的gradle生成文件现在包含:

dependencies {
    // Embedded tomcat dependencies
    compile "org.apache.tomcat:tomcat-dbcp:9.0.0.M1"
}

这个问题的解决方案分两步进行。首先,我必须使用儿童方法来设置正确的上下文,在这个问题中可以找到

正如所想象的那样,我当时唯一需要做的更改是getTomcatEmbeddedServletContainer方法。我对原稿进行了如下编辑:

<Resource name="myDatasourceName" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="root" password="password" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/my_db_name"/>
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
    tomcat.enableNaming();
    TomcatEmbeddedServletContainer container =
    super.getTomcatEmbeddedServletContainer(tomcat);
    for (Container child: container.getTomcat().getHost().findChildren()) {
        if (child instanceof Context) {
            ClassLoader contextClassLoader =((Context)child).getLoader().getClassLoader();
            Thread.currentThread().setContextClassLoader(contextClassLoader);
            break;
        }
    }
    return container;
}
接下来,我必须编辑gradle构建文件,以包含dbcp源依赖项。我的gradle生成文件现在包含:

dependencies {
    // Embedded tomcat dependencies
    compile "org.apache.tomcat:tomcat-dbcp:9.0.0.M1"
}

jndiDataSource()块的用途是什么?你能分享你的代码吗?我似乎无法在3上完成此操作。发布您的代码如何?(以及任何错误消息。)如果执行此操作如何:
resource.setName(“java:comp/env/jdbc/”+name)
相同问题:/javax.naming.NameNotFoundException:name[comp/env]在此上下文中未绑定。找不到[comp]。真奇怪。您能否尝试在调试器中运行它,并查看它是否在
tomcat.enableNaming()处停止和在
后处理上下文()
?jndiDataSource()块的用途是什么?你能分享你的代码吗?我似乎无法在3上完成此操作。发布您的代码如何?(以及任何错误消息。)如果执行此操作如何:
resource.setName(“java:comp/env/jdbc/”+name)
相同问题:/javax.naming.NameNotFoundException:name[comp/env]在此上下文中未绑定。找不到[comp]。真奇怪。您能否尝试在调试器中运行它,并查看它是否在
tomcat.enableNaming()处停止和在
后处理上下文()
中?