zoukankan      html  css  js  c++  java
  • Springboot解决Main方法启动无法注入JNDI

    Springboot解决Main方法启动无法注入JNDI

    上一篇Springboot配置外部容器使用JNDI读取数据源,讲到部署到web容器如何使用JNDI读取数据源。

    那么在开发时Main方法启动怎么使用JNDI读取数据源??

    需求

    仅在dev环境下解决main方法无法注入JNDI,生产和测试需要部署在web容器中

    步骤

    • 配置application-dev.yml
    ## 仅在dev环境下注入有效,解决main方法无法注入JNDI—— @Profile("dev")
    jndi:
      dev:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.xxx.xxx:3306/test
        username: root
        password: root
    
    • 配置JndiDevConfig
    package cn.pconline.config.dev;
    
    import org.apache.catalina.Context;
    import org.apache.catalina.startup.Tomcat;
    import org.apache.tomcat.util.descriptor.web.ContextResource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
    import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;
    
    import javax.sql.DataSource;
    
    /**
     * @Description 仅在dev环境下有效解决main方法无法注入JNDI
     *              生产和测试需要部署在web容器中
     * https://412887952-qq-com.iteye.com/blog/2429442
     * @Author jie.zhao
     * @Date 2019/7/31 14:19
     */
    @Configuration
    @Profile("dev")
    public class JndiDevConfig {
    
        @Value("${spring.datasource.jndi-name}")
        private String jndiName;
    
        @Value("${jndi.dev.driver-class-name}")
        private String driverClassName;
    
        @Value("${jndi.dev.url}")
        private String url;
    
        @Value("${jndi.dev.username}")
        private String username;
    
        @Value("${jndi.dev.password}")
        private String password;
    
        @Bean
        public ServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
                @Override
                protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
                    tomcat.enableNaming();
                    return super.getTomcatWebServer(tomcat);
                }
    
                @Override
                protected void postProcessContext(Context context) {
                    ContextResource resource = new ContextResource();
                    resource.setName(jndiName);
                    resource.setType(DataSource.class.getName());
                    resource.setProperty("driverClassName", driverClassName);
                    resource.setProperty("url", url);
                    resource.setProperty("username", username);
                    resource.setProperty("password", password);
                    context.getNamingResources().addResource(resource);
                    super.postProcessContext(context);
                }
            };
            return tomcat;
        }
    }
    
    
    • 启动报错
    SpringBoot JNDI datasource throws java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory
    

    原因是缺少依赖

    <!--解决Dev环境下mian方法使用JNDI连接池,正式打包不需要 provided-->
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-dbcp</artifactId>
        <version>8.5.4</version>
        <scope>provided</scope>
    </dependency>
    

    参考文档:

    https://412887952-qq-com.iteye.com/blog/2429442

    https://stackoverflow.com/questions/39284947/springboot-jndi-datasource-throws-java-lang-classnotfoundexception-org-apache-t

    -------------已经触及底线 感谢您的阅读-------------
  • 相关阅读:
    WSGI-mini-web框架服务器
    pymsql链接数据库报错2003的解决过程记录
    官方案例--Survival Shoot(一)
    Python-Day5修改haproxy配置文件
    Python-Day4实现简单的shell sed替换功能
    Python-列表嵌套字典-名片管理系统(适合刚学习完字典和列表的同学练手)
    Python-列表的运用-名字管理系统
    Vi 编写一个剪刀石头布游戏
    Python-Day3 购物系统
    Python-Day2三级菜单
  • 原文地址:https://www.cnblogs.com/cnsyear/p/12913341.html
Copyright © 2011-2022 走看看