Spring Boot - JNDI值查找

时间:2016-04-16 12:51:52

标签: java spring spring-boot jndi lookup

this.ControlCollection.Find(Name, false);

在上面的代码中有一种方法可以从bean访问 test / value (就像数据源Bean一样)???

我尝试了很多方法,但似乎没有任何效果。我可以使用(@SpringBootApplication public class SampleTomcatJndiApplication { public static void main(String[] args) { SpringApplication.run(SampleTomcatJndiApplication.class, args); } @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/myDataSource"); resource.setType(DataSource.class.getName()); resource.setProperty("driverClassName", "your.db.Driver"); resource.setProperty("url", "jdbc:yourDb"); context.getNamingResources().addResource(resource); ContextEnvironment contextEnv = new ContextEnvironment(); contextEnv.setName("test/value"); contextEnv.setType("java.lang.String"); contextEnv.setOverride(false); contextEnv.setValue("testing"); context.getNamingResources().addEnvironment(contextEnv); } }; } @Bean(destroyMethod="") public DataSource jndiDataSource() throws IllegalArgumentException, NamingException { JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); bean.setJndiName("java:comp/env/jdbc/myDataSource"); bean.setProxyInterface(DataSource.class); bean.setLookupOnStartup(false); bean.afterPropertiesSet(); return (DataSource)bean.getObject(); } )从控制器访问测试/值。

1 个答案:

答案 0 :(得分:0)

有一种方法可以访问test/value ...因为您在Spring上下文中初始化嵌入式Tomcat容器,所以必须延迟InitialContext的初始化(直到env vars已经设置)。

为实现这一目标,我使用了Spring的@Lazy注释。 e.g。

<强> SampleTomcatJndiApplication.java

import javax.naming.*;

@Bean
@Lazy
public Context environmentContext() throws NamingException {
    Context ctx = new InitialContext();
    Context envCtx = (Context) ctx.lookup("java:comp/env");
    return envCtx;
}

<强> SomeOtherComponent.java

@Lazy
@Autowired
private Context environmentContext;

public String getTestValue() throws NamingException {
    return environmentContext.lookup("test/value").toString();
}

不确定这是否违反任何&#34;最佳做法&#34; - 也许Spring有更好的方法来检索JNDI变量?如果在服务器端更改JNDI var(无论该值是否重新查找),不确定含义是什么?如果有人知道,请回到这里!