2016-04-16 6 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(); 
    } 

は私が(ただ、データソースビーンワークスなど)豆からテスト/値にアクセスできる方法はあり?春ブーツ - 上記のコードでJNDI値のルックアップ

私は多くのアプローチを試みましたが、何も動作していないようです。私はコントローラ(new InitialContext().lookup("java:comp/env/test/value"))を使ってテスト/値にアクセスすることができます。

+0

なぜJNDIを使用したいのですか?追加するものは、組み込みコンテナを使用しているため、データソースをJNDIの代わりにプレーンBeanとして宣言することで同じ結果を得ることができます。あなたは物事をより複雑にし、必要としています。 –

答えて

0

test/valueにアクセスする方法があります。埋め込みTomcatコンテナをSpringコンテキスト内で初期化するため、の初期化を(env変数が設定されるまで)延期する必要があります。

これを達成するために、私は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が変更された場合(値が再検索されたかどうか)、その意味が分かりませんか?誰かが知っているなら、ここに投稿してください!