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

In dem obigen Code ist es eine Möglichkeit, dass ich den Test/Wert aus einer Bohne (Wie Datasource Bean Works) zugreifen kann ???Frühling Boot - JNDI Wert Lookup

Ich habe viele Ansätze versucht, aber nichts scheint zu funktionieren. Ich kann auf den Test/Wert von einem Controller mit (new InitialContext().lookup("java:comp/env/test/value")) zugreifen.

+0

Warum möchten Sie sogar JNDI verwenden? Wenn Sie einen eingebetteten Container verwenden, können Sie dasselbe erreichen, indem Sie die Datenquelle als einfache Bean anstelle von JNDI deklarieren. IMHO machen Sie die Dinge komplexer als nötig. –

Antwort

0

Es gibt eine Möglichkeit, auf test/value zuzugreifen ... Da Sie Ihren eingebetteten Tomcat-Container im Spring-Kontext initialisieren, müssen Sie die Initialisierung Ihrer InitialContext verzögern (bis die Envvars eingerichtet wurden).

Um dies zu erreichen, habe ich Spring @Lazy Annotation verwendet. z.B.

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

nicht sicher, ob dies gegen alle "best practices" - vielleicht Frühling hat eine bessere Art und Weise JNDI Variablen des Abrufens? ? Nicht sicher, was die Implikationen sind, wenn die JNDI-Var auf der Serverseite geändert wird (ob der Wert erneut nachgeschlagen wird)? Wenn jemand weiß, bitte posten Sie hier!

Verwandte Themen