201. Spring Boot JNDI:Spring Boot中怎么玩JNDI


 

 

【視頻&交流平台】

à SpringBoot視頻http://t.cn/R3QepWG

à SpringCloud視頻http://t.cn/R3QeRZc

à Spring Boot源碼https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台http://412887952-qq-com.iteye.com/blog/2321532

à Spring Boot Shiro視頻http://t.cn/R3QDMbh

à Spring Boot 2.0 之Spring Data 和JPAhttp://t.cn/R1pSojf

 

歷史相關文章:

199. Spring Boot JNDI:這是蝦米?

200. Spring Boot JNDI:在Tomcat中怎么玩JNDI?

 

 

說明:

(1)Spring Boot 版本:2.0.2.RELEASE

(2)Tomcat版本:8.0.28

 

前言:

       在上一篇文章中花了不少時間介紹了Tomcat中怎么玩JNDI,來重點來了,在Spring Boot中是怎么玩的呢???

 

一、Spring Boot老版本怎么玩?

       在比較老的Spring Boot中是怎么玩的,大體的思路是:

(1)注入TomcatFactory工廠類,獲取到上下文Context,往上下文中設置resource對象。

(2)注入jndi DataSource。

       具體代碼如下(手機端支持左右滑動):

    @Bean
   public TomcatEmbeddedServletContainerFactory tomcatFactory() {
       return new TomcatEmbeddedServletContainerFactory() {
           @Override
           protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                   Tomcat tomcat)
{
               tomcat.enableNaming();
               return super.getTomcatEmbeddedServletContainer(tomcat);
           }
           @Override
           protected void postProcessContext(Context context) {
               ContextResource resource = new ContextResource();
               resource.setName("jdbc/mydb");
               resource.setType(DataSource.class.getName());
               resource.setProperty("driverClassName", "com.mysql.jdbc.Driver");
               resource.setProperty("url", "jdbc:mysql://localhost:3306/mydb");
               resource.setProperty("username", "root");
               resource.setProperty("password","root");
               context.getNamingResources().addResource(resource);
           }
       };
   }
   @Bean
   public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
       JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
       bean.setJndiName("java:comp/env/jdbc/mydb");
       bean.setProxyInterface(DataSource.class);
       bean.setLookupOnStartup(false);
       bean.afterPropertiesSet();
       return (DataSource)bean.getObject();
   }

 

二、Spring Boot 2.0版本怎么玩呢?

2.1 打包成war包

       通過上一篇文章,我們可以把配置放到tomcat/conf/context.xml里,那么在Spring Boot中,我們只要配置jndi指向的名稱就可以了,對於這個點的,Spring Boot還是提供了相應的配置的,在application.properties添加如下配置:

spring.datasource.jndi-name=jdbc/mydb

或者是:

spring.datasource.jndi-name=java:comp/env/jdbc/mydb

       對於context.xml文件的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context >  
<Resource name="jdbc/mydb"
    auth="Container"
    type="javax.sql.DataSource"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/mydb"
    username="root" password="root"
    maxActive="20" maxIdle="10"
    maxWait="10000"/>

</Context>

 

       然后打包成war包,在tomcat容器中進行運行,但我們不能每次都打包去測試,這樣肯定會影響開發效率的,那么對於Embedded Tomcat的話,要怎么搞呢?

 

2.2 Embedded Tomcat

       對於Embedded Tomcat的話,需要添加ServletWebServerFactory進行配置:

@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("jdbc/mydb");
               resource.setType(DataSource.class.getName());
               resource.setProperty("driverClassName", "com.mysql.jdbc.Driver");
               resource.setProperty("url", "jdbc:mysql://localhost:3306/mydb");
               resource.setProperty("username", "root");
               resource.setProperty("password","root");
               context.getNamingResources().addResource(resource);
               super.postProcessContext(context);
           }
       };
       return tomcat;
   }

 

說明:

(1)對於SpringBoot 2.0是ServletWebServerFactory,舊一點的版本應該是TomcatEmbeddedServletContainerFactory,不然就會出現類無法找到了。

(2)tomcat.enableNaming():啟用默認禁用的JNDI命名

(3)ContextResource:構建一個ContextResource對象,然后添加到Context對象中。

 

在application.properties添加如下配置:

spring.datasource.jndi-name=jdbc/mydb

到這里就可以使用jndi構建的DataSource了。

 

2.3 Embedded Tomcat+context.xml嘗試

       我們知道對於context.xml有一種局部配置的方式是放到/META-INF/context.xml下的,那么對於Spring Boot目前支持這種方式嘛,經測試結果不支持,會報如下的錯誤:

Failed to look up JNDIDataSource with name 'jdbc/mydb'; nested exception isjavax.naming.NoInitialContextException: Need to specify class name inenvironment or system property, or as an applet parameter, or in an applicationresource file: java.naming.factory.initial

       不支持的話,目前也只能等官方進行升級了,或者聰明的你還有別的方式?

 

à悟空學員:http://t.cn/Rg3ICnJ

學院中有Spring Boot相關的課程!點擊「進入學院」進行查看!

開學季所有課程優惠一周

 

下雨天,適合學「Spring Boot」

 

微信公眾號「SpringBoot最近更新:

 

Java8新特性:方法引用 209. SpringBoot quartz:sqlserver啟動只有 DECLARE CURSOR 才允許使用... 風口之上,我是那頭豬嘛? Java8新特性:Lambda表達式: 摸摸里面 Java8新特性:Lambda表達式:過關斬將:使用場景 Java8新特性:Lambda表達式:小試牛刀 下雨天,適合學「Spring Boot」 Java8新特性:接口的默認方法 208. Spring Boot Swagger2:排序 – 漂游記 207. Spring Boot Swagger2:極簡方式 我讀的書很多,但都沒有你好看【一禪錄】 206. Spring Boot 2.0 Swagger2:使用 205. Spring Boot 2.0 Swagger2:初識Swagger 當要離開的時候,我卻動情了 205. jetcache:你需要知道的小技巧 204. jetcache:在Spring Boot中怎么玩? 

 搜索springboot或者掃描以下二維碼即可關注:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM