2014-12-15 15 views
5

Ich habe eine Spring Boot (v 1.1.9) Anwendung als WAR-Datei bereitstellen. Und ich versuche, diese Webanwendung mit einem vorhandenen Datendienstmodul zu integrieren (hinzugefügt als Mavenabhängigkeit).Spring Boot JNDI Datenquelle Lookup fehlgeschlagen - Name comp/env/jdbc nicht im Kontext gefunden "java:"

versucht Umwelt zu implementieren: WebSphere Application Server 8.5.5.4

Das Problem, das ich mit Blick auf bin ist eine Anwendung, Start-up-Fehler, wenn versuchen, eine JNDI Datasource (jdbc/fileUploadDS) zu Nachschau wie unten im abhängigen Datendienstmodul.

@Configuration 
@Profile("prod") 
public class JndiDataConfig implements DataConfig { 

    @Bean 
    public DataSource dataSource() throws NamingException { 
      Context ctx = new InitialContext(); 
      return (DataSource) ctx.lookup("java:comp/env/jdbc/fileUploadDS"); 
    } 

} 

My Frühlings-Boot-Konfiguration:

@Configuration 
@ComponentScan(basePackages = { "au.com.aiaa.fileupload.data.*", "demo" }) 
@EnableAutoConfiguration(exclude = { HibernateJpaAutoConfiguration.class, DataSourceAutoConfiguration.class }) 
public class SampleApplication extends SpringBootServletInitializer { 

    public static void main(String[] args) { 
     SpringApplication.run(applicationClass, args); 
    } 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(applicationClass); 
    } 

    private static Class<SampleApplication> applicationClass = SampleApplication.class; 

    @Bean 
    public static Properties fileUploadJndiProperties() throws NamingException { 
     JndiObjectFactoryBean jndiFactoryBean = new JndiObjectFactoryBean(); 
     jndiFactoryBean.setJndiName("props/FileUploadProperties"); 
     jndiFactoryBean.setExpectedType(Properties.class); 
     jndiFactoryBean.setLookupOnStartup(true); 
     jndiFactoryBean.afterPropertiesSet(); 
     return (Properties) jndiFactoryBean.getObject(); 
    } 

} 

Bitte beachte, dass ich in der Lage erfolgreich Requisiten/FileUploadProperties nachzuschlagen. Aber nicht das Gleiche für eine Datenquelle tun.

Mein Zweifel ist es versucht zu laden EmbeddedWebApplicationContext was ist nicht was ich will.

Der Stack-Trace ist:

Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig.dataSource() throws javax.naming.NamingException] threw exception; nested exception is **javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "java:".** 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:301) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1186) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:706) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
     at **org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)** 
     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
     at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:142) 
     at org.springframework.boot.context.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:89) 
     at org.springframework.boot.context.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:51) 
     at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175) 


.................. 

Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig.dataSource() throws javax.naming.NamingException] threw exception; nested exception is **javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "java:".** 
     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:188) 
     at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:586) 
     ... 132 common frames omitted 
Caused by: javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "java:". 
     at com.ibm.ws.naming.ipbase.NameSpace.getParentCtxInternal(NameSpace.java:1970) 
     at com.ibm.ws.naming.ipbase.NameSpace.retrieveBinding(NameSpace.java:1377) 
     at com.ibm.ws.naming.ipbase.NameSpace.lookupInternal(NameSpace.java:1220) 
     at com.ibm.ws.naming.ipbase.NameSpace.lookup(NameSpace.java:1142) 
     at com.ibm.ws.naming.urlbase.UrlContextImpl.lookupExt(UrlContextImpl.java:1436) 
     at com.ibm.ws.naming.java.javaURLContextImpl.lookupExt(javaURLContextImpl.java:477) 
     at com.ibm.ws.naming.java.javaURLContextRoot.lookupExt(javaURLContextRoot.java:485) 
     at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:370) 
     at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161) 
     at javax.naming.InitialContext.lookup(InitialContext.java:436) 
     at au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig.dataSource(JndiDataConfig.java:41) 
     at au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig$$EnhancerBySpringCGLIB$$8001dbbe.CGLIB$dataSource$0(<generated>) 
     at au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig$$EnhancerBySpringCGLIB$$8001dbbe$$FastClassBySpringCGLIB$$3c9e0518.invoke(<generated>) 
     at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
     at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:312) 
     at au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig$$EnhancerBySpringCGLIB$$8001dbbe.dataSource(<generated>) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
     at java.lang.reflect.Method.invoke(Method.java:611) 
     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166) 

Was bin ich hier? Selbst wenn ich versuche, die Methode dataSource bean in SampleApplication.java wie unten explizit zu definieren, schlägt sie mit dem gleichen Fehler fehl.

@Bean 
    public static DataSource dataSource() throws NamingException { 
     JndiObjectFactoryBean jndiFactoryBean = new JndiObjectFactoryBean(); 
     jndiFactoryBean.setJndiName("java:comp/env/jdbc/fileUploadDS"); 
     jndiFactoryBean.setExpectedType(DataSource.class); 
     jndiFactoryBean.setLookupOnStartup(true); 
     jndiFactoryBean.setResourceRef(true); 
     jndiFactoryBean.afterPropertiesSet(); 
     return (DataSource) jndiFactoryBean.getObject(); 
    } 

I bezeichnet this und es sagt, wir brauchen enableNaming() auf Servlet-Container setzen? Kann ich etwas Ähnliches für nicht eingebettete Webanwendungskontexte tun? Oder ist es eine reine WAS 8.5 Ausgabe?

+0

Haben Sie versucht, die 'JndiObjectFactoryBean 'OHNE' java: comp/env/'Teil? –

+0

Sie müssen eine Ressourcenreferenz mit 'jdbc/fileUploadDS' in Ihrer' web.xml' haben. Stellen Sie sicher, dass es während der Installation oder über die Datei "ibm-web-bnd.xml" an den tatsächlichen Datenquellennamen gebunden ist. – Gas

+1

Danke @Gas es funktioniert. Ich habe die Resource-Ref in web.xml hinzugefügt und den Ressourcenverweis bei der Installation in der WAS Admin-Konsole an die tatsächliche Datenquelle gebunden. Aber wie erreiche ich das Gleiche ohne eine web.xml in meiner Spring-Boot-Anwendung? Ich lese [hier] (http://docs.spring.io/autorepo/docs/spring-boot/current-SNAPSHOT/reference/html/howto-traditional-deployment.html), wie man , ersetzt oder , in der Spring Boot-Konfigurationsklasse, die SpringBootServletInitializer erweitert. Gibt es für auch ein Äquivalent? –

Antwort

7

Sie müssen Ressourcenreferenz mit jdbc/fileUploadDS Name in Ihrem web.xml haben. Stellen Sie sicher, dass es während der Installation oder über die Datei ibm-web-bnd.xml an den tatsächlichen Datenquellennamen gebunden ist.

Definition in web.xml:

<resource-ref> 
    <description /> 
    <res-ref-name>jdbc/fileUploadDS</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 

Wenn Sie nicht wollen, web.xml, dann in normalen Java EE App nutzen könnten Sie einfach in Web-Komponente (Servlets, Filter) der folgenden Klasse Anmerkung hinzufügen:

@Resource(name="jdbc/fileUploadDS", type=javax.sql.DataSource.class, lookup="jdbc/fileUploadDS") 

aber ich bin kein Spring-Boot-Experte, also weiß nicht, ob es funktionieren wird oder dort möglich ist.

+0

Wie bereits erwähnt, ist das Hinzufügen von die einzige Option, die meinen Anforderungen entspricht, da ich die dataSource nicht innerhalb der Spring-Boot-Anwendung suchen muss, sondern innerhalb einer externen Abhängigkeit. Selbst wenn ich @Resource funktioniere, ist es nicht das, wonach ich suche. –

+1

@DinushaKariyawasam Ok. Übrigens hat die '@ Resource' auf der Ebene ** class ** die gleiche Funktionalität wie in' web.xml'. Wenn die Anwendung installiert ist, werden Klassen nach Annotationen durchsucht und die Web.xml-Datei wird zusammengeführt. Sie können den zusammengeführten Implementierungsdeskriptor über die Admin-Konsole anzeigen. – Gas

+0

Sie haben Recht! Dies ist, wie ich es in Java 6/JEE 5 @Resource (name = "jdbc/fileUploadDS", type = javax.sql.DataSource.class) öffentliche Klasse TestServlet erweitert HttpServlet { } Ich bezog mich auf '** Deklaration Resource References ** 'Abschnitt in [Oracle Dokumentation] (http://docs.oracle.com/javaee/5/tutorial/doc/bnaeo.html#bnaew) und wir können @Resource kommentieren ** alle Webkomponenten, die Ressource akzeptieren Injektionen ** –

1

Ich stehe vor dem gleichen Problem. Ich weiß nicht, wie man das Tag im Spring Boot definiert, da es im Spring Boot keine web.xml Datei gibt.

Bisher habe ich erfahren, dass wir es in der Anwendungsdatei definieren müssen, von wo aus wir unsere Federanwendung starten. Ich denke, wir müssen diese Methode verwenden, um die Datenquelle zu setzen:

@Bean(destroyMethod="") 
    @ConfigurationProperties(prefix="datasource.mine") 
    public DataSource dataSource() throws Exception { 
     JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup(); 
     return dataSourceLookup.getDataSource("java:jdbc/configurationFile"); 
    } 
0

Ich bin die Lage, meine Feder-Boot-Anwendung verbinden (zum Einsatz in Websphere Application Server 9) nach WAS Datenquelle. Der folgende Code für mich gearbeitet, um Datasource für den Anschluss:

@Bean(name = "WASDataSource") 
public DataSource WASDataSource() throws Exception {   
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup(); 
return dataSourceLookup.getDataSource("DSNAME"); 
} 

@Bean(name = "WASDataSourceJdbcTemplate") 
public JdbcTemplate jdbcTemplate_WASDS(@Qualifier("WASDataSource") 
DataSource dsDB2) { 
return new JdbcTemplate(dsDB2); 
} 

Hinweis: Der Name der Datenquelle „DSNAME“ ist der Name, der auf der Benutzeroberfläche von Websphere Konsole angezeigt wird. Sie können dies über -> Ressourcen auswählen> JDBC> Datenquellen sehen.

Dann habe ich jdbc Vorlage:

@Autowired 
@Qualifier("WASDataSourceJdbcTemplate") 
private JdbcTemplate db2WASTemplate;` 

Und Abfrage läuft die Abfrage-Methode funktioniert:
db2WASTemplate.query()

ich keine Web.xml oder ibm-web erstellt haben -bnd.xml Dateien

0

ich gerade Frühjahr Boot konfiguriert mit meiner benutzerdefinierten Datenquelle wie folgt:

@Bean 
@ConfigurationProperties("spring.datasource") 
public DataSource dataSource() { 
    return DataSourceBuilder.create().build(); 
} 

und innerhalb der Datei application.properties ich alle Einstellungen als Datenquelle definiert üblichen

spring.datasource.driver-class-name= *** 
spring.datasource.url= *** 
spring.datasource.username= *** 
spring.datasource.password= *** 
spring.datasource.jndi-name=jdbc/myDB 

Es funktioniert nicht gut mit @SpringBootApplication mit allen anderen Standardeinstellungen

Dank