gpt4 book ai didi

java - Spring Boot - JNDI 值查找

转载 作者:太空宇宙 更新时间:2023-11-04 12:42:45 25 4
gpt4 key购买 nike

@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();
}

在上面的代码中,有没有一种方法可以让我从 bean 访问测试/值(就像数据源 Bean 的工作方式一样)???

我尝试了很多方法,但似乎没有任何效果。我可以使用( new InitialContext().lookup("java:comp/env/test/value") )从 Controller 访问测试/值。

最佳答案

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

为了实现这一点,我使用了 Spring 的 @Lazy 注释。例如

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();
}

不确定这是否违反了任何“最佳实践”——也许 Spring 有更好的方法来检索 JNDI 变量?不确定如果 JNDI 变量在服务器端发生更改(是否重新查找该值)会产生什么影响?如果有人知道,请回帖!

关于java - Spring Boot - JNDI 值查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36664417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com