簡體   English   中英

遠程 JNDI + Spring Boot + WebLogic,如何從 application.property 指定上下文?

[英]Remote JNDI + Spring Boot + WebLogic, How to specify the context from the application.property?

我正在 Spring Boot 和 Spring Data 中開發一個項目,我想使用來自 WebLogic 遠程服務器的 JNDI。

我有一個不使用 Spring 的舊示例,它按以下方式執行:

DataSource pool = null; Hashtable ht = null;
ht = new Hashtable( );
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL,"t3://192.151.120.180:7003,192.151.121.180:7005");
ht.put(weblogic.jndi.WLContext.ENABLE_SERVER_AFFINITY, "true");
env =  new InitialContext(ht);
pool = (DataSource) env.lookup("jdbc.conPesos");

我想做同樣的連接,但是從application.property文件(或application.yml文件)與 Spring Boot 。

這是我的代碼:

 spring:
     datasource:
         driver-class-name: oracle.jdbc.OracleDriver
         url: t3://192.151.120.180:7003
         jndi-name: java:/comp/env/jdbc/conPesos

我得到了錯誤:

在類路徑資源 [----] 中定義名稱為“dataSource”的 bean 創建時出錯:通過工廠方法的 Bean 實例化失敗; 嵌套異常是 org.springframework.beans.BeanInstantiationException:無法實例化 [javax.sql.DataSource]:工廠方法 'dataSource' 拋出異常; 嵌套異常是 org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException:無法查找名稱為“java:/comp/env/jdbc/conPesos”的 JNDI 數據源; 嵌套異常是 javax.naming.NoInitialContextException:需要在環境或系統屬性中指定類名,或作為小程序參數,或在應用程序資源文件中:java.naming.factory.initial

為了解決這個錯誤,我用下面的代碼創建了一個@configuration類:

 @Bean public DataSource dataSource() throws NamingException {
     Context ctx ;
     DataSource dataSource;
     Hashtable<String, String> ht;
     NamedParameterJdbcTemplate np;

     ht = new Hashtable<>();
     ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
     ht.put(Context.PROVIDER_URL, "t3://192.151.120.180:7003");
     ht.put(weblogic.jndi.WLContext.ENABLE_SERVER_AFFINITY, "true");
     ctx = new InitialContext(ht);

     dataSource=(DataSource) ctx.lookup("jdbc.conPesos");
     return dataSource; }

另外我必須在主類中編寫SpringBootApplication(exclude = JmxAutoConfiguration.class) 它工作正常,但是我想從application.property文件中執行此操作,但我不知道如何在該文件中添加 INITIAL_CONTEXT_FACTORY 屬性。

有人知道嗎?

請注意使用以下注釋參數,否則 WebLogic 管理的數據源將在您的應用程序第一次停止/取消部署時被 Spring Boot 停止,並且在 WebLogic Server(JVM) 重新啟動之前不會重新啟動:

@Bean(destroyMethod = "")    

這將引發如下異常:

Caused by: java.sql.SQLException: DataSource jdbc/myDatasource is not active
    at weblogic.jdbc.common.internal.WLDataSourceImpl.checkActive(WLDataSourceImpl.java:596)
    at weblogic.jdbc.common.internal.WLDataSourceImpl.getConnectionInternal(WLDataSourceImpl.java:617)
    at weblogic.jdbc.common.internal.WLDataSourceImpl.getConnection(WLDataSourceImpl.java:611)
    at weblogic.jdbc.common.internal.WLDataSourceImpl.getConnection(WLDataSourceImpl.java:604)
    at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:108)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)

我可以從類配置中解決這個問題(我無法從 application.property 文件中解決這個問題)。 使用以下代碼:

@Bean(name = "conProcesosDS")
    public DataSource dataSourceProcesos() throws NamingException {
        Context ctx;
        DataSource dataSource;
        Hashtable<String, String> ht;

        ht = new Hashtable<>();
        ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        ht.put(Context.PROVIDER_URL, "t3://192.151.120.180:7003");
        ht.put(weblogic.jndi.WLContext.ENABLE_SERVER_AFFINITY, "true");
        ctx = new InitialContext(ht);

        dataSource = (DataSource) ctx.lookup("jdbc.conPesos");
        return dataSource;
    }

您必須添加wlfullclient-10.1.0.1.jar庫。 Maven 沒有這個庫,你必須在網上搜索它並將其添加到項目中。 (我用 nexus 創建了一個本地存儲庫)。

我還在主類中添加了注解@SpringBootApplication(exclude = JmxAutoConfiguration.class)。 像這樣:

@SpringBootApplication(exclude = JmxAutoConfiguration.class)
public class Aplicacion extends SpringBootServletInitializer implements WebApplicationInitializer {

    public static void main(String[] args) throws NamingException {
        SpringApplication.run(Aplicacion.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Aplicacion.class);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM