springboot2.x Embedded Tomcat 配置jndi

对于Embedded Tomcat的话,需要添加ServletWebServerFactory进行配置

  • 配置ServletWebServerFactory
@Configuration
public class JNDIConfig {

    @Bean
    public ServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory(){
            @Override
            protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
                // 启用默认禁用的JNDI命名
                tomcat.enableNaming();
                return super.getTomcatWebServer(tomcat);
            }
            @Override
            protected void postProcessContext(Context context) {
                ContextResource resource = new ContextResource();
                resource.setName("jdbc/orcl");
                resource.setType(DataSource.class.getName());
                resource.setProperty("driverClassName", "oracle.jdbc.driver.OracleDriver");
                resource.setProperty("url", "jdbc:oracle:thin:@192.168.11.245:1521/Base");
                resource.setProperty("username", "U_JSP");
                resource.setProperty("password","U_JSP");
                context.getNamingResources().addResource(resource);
                super.postProcessContext(context);
            }
        };
        return tomcatServletWebServerFactory;
    }
}

  • 配置application.properties
## springdata source jndi
#   spring.datasource.jndi-name=java:comp/env/jdbc/orcl
spring.datasource.jndi-name=jdbc/orcl

参考

  • 错误一:
Caused by:## java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory##
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_151]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_151]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_151]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_151]
    at java.lang.Class.forName0(Native Method) ~[na:1.8.0_151]
    at java.lang.Class.forName(Class.java:264) ~[na:1.8.0_151]
    at org.apache.naming.factory.ResourceFactory.getDefaultFactory(ResourceFactory.java:50) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    ... 97 common frames omitted
  • 解决:
    • 在配置中加入resource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory");
protected void postProcessContext(Context context) {
                ContextResource resource = new ContextResource();
                resource.setName("jdbc/orcl");
                resource.setType(DataSource.class.getName());
                resource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory");
                resource.setProperty("driverClassName", "oracle.jdbc.driver.OracleDriver");
                resource.setProperty("url", "jdbc:oracle:thin:@192.168.11.245:1521/Base");
                resource.setProperty("username", "U_JSP");
                resource.setProperty("password","U_JSP");
                context.getNamingResources().addResource(resource);
                super.postProcessContext(context);
            }

参考

  • 错误二:
Caused by:## java.lang.ClassNotFoundException: org.apache.tomcat.jdbc.pool.DataSourceFactory##
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_151]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_151]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_151]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_151]
    at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:61) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    ... 96 common frames omitted
  • 解决:
    • 添加tomcat-jdbcjar包
        
            org.apache.tomcat
            tomcat-jdbc
            9.0.0.M27
         

参考

你可能感兴趣的:(springboot2.x Embedded Tomcat 配置jndi)