![](/img/trans.png)
[英]Spring boot + gradle pass comand line args to 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.