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();
}
)从控制器访问测试/值。
答案 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(无论该值是否重新查找),不确定含义是什么?如果有人知道,请回到这里!