2016-04-16 50 views
1
@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(正如数据源豆工程)访问测试/值方式???弹簧引导 - JNDI值查找

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

+0

为什么你甚至想要使用JNDI。它增加了什么,你正在使用一个嵌入式容器,所以你可以通过将数据源声明为普通的bean而不是JNDI来达到同样的效果。恕我直言,你正在使事情更复杂,然后需要。 –

回答

0

有一种方法可以访问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(); 
} 

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