2016-04-12 9 views
3

wenn ich Java-Basis benutze, um meinen JNDI zu konfigurieren. Frühling 4.2.5.Warum JndiObjectFactoryBean zu konfigurieren JNDI-Datenquelle hat nicht funktioniert?

Aber wenn ich JndiObjectFactoryBean zu config.when ich die datasource bekommen wollen, wird das Objekt null sein.

@Bean 
    public DataSource dataSource(){ 
     JndiObjectFactoryBean jndiObjectFactoryBean =new JndiObjectFactoryBean(); 
     jndiObjectFactoryBean.setJndiName("jdbc/SpittrDS"); 
     jndiObjectFactoryBean.setResourceRef(true); 
     jndiObjectFactoryBean.setProxyInterface(DataSource.class); 
     return (DataSource) jndiObjectFactoryBean.getObject(); //NULL!!! 
    } 

Aber wenn die Methode zu diesem ändern, funktioniert es gut.

@Bean 
    public DataSource dataSource(){ 
     final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); 
     dsLookup.setResourceRef(true); 
     DataSource dataSource = dsLookup.getDataSource("java:comp/env/jdbc/SpittrDS"); 
     return dataSource; 
    } 

Ich weiß nicht, wo das Problem ist.

Tomcat 9.0 context.xml

<Context> 

    <!-- Default set of monitored resources. If one of these changes, the --> 
    <!-- web application will be reloaded.         --> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> 

    <!-- Uncomment this to disable session persistence across Tomcat restarts --> 
    <!-- 
    <Manager pathname="" /> 
    --> 

    <Resource name="jdbc/SpittrDS" 
     auth="Container" 
     type="javax.sql.DataSource" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/spittrds" 
     username="root" 
     password="1" 
     maxActive="100" 
     maxIdle="20" 
     minIdle="5" 
     maxWait="10000"/> 
</Context> 

Antwort

2

Die eigentliche Suche in JndiObjectFactoryBean wird im Lebenszyklus Callback-Methode durchgeführt. Entweder rufen Sie die Methode explizit in Ihrer @Bean-Methode wie folgt (Problemumgehung)

Oder der bessere Ansatz. Lassen Sie Ihre @Bean-Methode das JndiObjectFactoryBean zurückgeben und dessen Lifecyle verwalten. Dann in der abhängigen Bohnen, die eine Datasource injizieren, um die Datenquelle aus der Fabrik erstellt erfordern

@Bean 
    public JndiObjectFactoryBean dataSource(){ 
     JndiObjectFactoryBean jndiObjectFactoryBean =new JndiObjectFactoryBean(); 
     jndiObjectFactoryBean.setJndiName("jdbc/SpittrDS"); 
     jndiObjectFactoryBean.setResourceRef(true); 
     jndiObjectFactoryBean.setProxyInterface(DataSource.class); 
     return jndiObjectFactoryBean; 
    } 

//in your dependnecy 

@Bean 
public SomeBean someBean(DataSource dataSource){ 
    //use the injected datasource shich comes from the factory 
} 
+0

ich möchte wissen, warum diese Methode 'jndiObjectFactoryBean.getObject()' 'return – TIMFUNNY

+2

null' Wie ich die eigentliche Lookup gesagt ist zu tun ne in der afterPropertiesSet-Methode, die Spring aufruft, nachdem die Bean erstellt wurde. Vor diesem Aufruf wurde das Objekt nicht von JNDI abgerufen. –

0

ich hier gelandet, ohne zu bemerken dies ein Problem war ich in der Vergangenheit konfrontiert war - Error Casting Spring's JndiObjectFactoryBean to ConnectionFactory for Solace-MQ JMS

So eine Abhilfe (nicht die bevorzugte Art und Weise) ist afterPropertiesSet() auf jndiObjectFactoryBean aufrufen, bevor zu getObject Versuch()

@Bean 
    public DataSource dataSource(){ 
     JndiObjectFactoryBean jndiObjectFactoryBean =new JndiObjectFactoryBean(); 
     jndiObjectFactoryBean.setJndiName("jdbc/SpittrDS"); 
     jndiObjectFactoryBean.setResourceRef(true); 
     jndiObjectFactoryBean.setProxyInterface(DataSource.class); 
     jndiObjectFactoryBean.afterPropertiesSet(); 
     return (DataSource) jndiObjectFactoryBean.getObject(); //NOT NULL 
    } 
Verwandte Themen