2016-04-16 64 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在服務器端發生更改(是否重新查找該值)會帶來什麼影響?如果有人知道,請回到這裏!