[英]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.