2014-12-15 19 views
5

Ho installato un'applicazione di avvio a molla (v 1.1.9) da distribuire come file WAR. E sto cercando di integrare questa applicazione web con un modulo di servizio dati esistente (aggiunto come dipendenza da parte di Maven).Avvio di primavera Errore di ricerca origine dati JNDI - Nome comp/env/jdbc non trovato nel contesto "java:"

Ambiente cercando di distribuire: WebSphere Application Server 8.5.5.4

Il problema che sto affrontando è un'applicazione fallimento start-up quando si tenta di look-up un DataSource JNDI (JDBC/fileUploadDS) come di seguito all'interno del modulo di servizio dati dipendente.

@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"); 
    } 

} 

La mia Primavera di configurazione di avvio:

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

} 

nota che sono in grado di ricercare puntelli/FileUploadProperties successo. Ma non riuscendo a fare lo stesso per un'origine dati.

Il mio dubbio è che si sta tentando di caricare un EmbeddedWebApplicationContext che non è quello che voglio.

L'analisi dello stack è:

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) 

Che cosa mi manca qui? Anche quando provo a definire esplicitamente il metodo del bean dataSource in SampleApplication.java come sotto, fallisce con lo stesso errore.

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

ho fatto riferimento this e si dice che dobbiamo impostare enableNaming() su servlet container? Posso fare qualcosa di simile per il contesto di un'applicazione Web non incorporata? O è puramente un problema di WAS 8.5 ??

+0

Hai provato il 'JndiObjectFactoryBean 'SENZA la parte' java: comp/env/'? –

+0

È necessario avere un riferimento risorsa con il nome 'jdbc/fileUploadDS' nel proprio' web.xml'. Assicurati che sia associato al nome effettivo dell'origine dati durante l'installazione o tramite il file 'ibm-web-bnd.xml'. – Gas

+1

Grazie a @Gas funziona. Ho aggiunto la risorsa-ref in web.xml e ho associato il riferimento risorsa all'origine dati effettiva durante l'installazione nella console di amministrazione di WAS. Ma come ottengo lo stesso senza un web.xml nella mia applicazione di avvio di primavera? Ho letto [qui] (http://docs.spring.io/autorepo/docs/spring-boot/current-SNAPSHOT/reference/html/howto-traditional-deployment.html) come sostituire , oppure , nella classe di configurazione di avvio di primavera che estende SpringBootServletInitializer. Esiste anche un equivalente per ? –

risposta

7

È necessario disporre del riferimento risorsa con il nome jdbc/fileUploadDS nel numero web.xml. Assicurarsi che sia associato al nome dell'origine dati effettivo durante l'installazione o tramite il file ibm-web-bnd.xml.

Definizione 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> 

se non volete utilizzare web.xml, poi nella normale applicazione Java EE si può solo aggiungere nella componente web (servlet, filtro) la seguente classe di annotazione:

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

ma io non sono esperto di Spring-boot, quindi non so, se funzionerà o è possibile lì.

+0

Come ho già detto, l'aggiunta di è l'unica opzione che si adatta alle mie esigenze in quanto non è necessario cercare il dataSource all'interno dell'applicazione Spring Boot ma all'interno di una dipendenza esterna. Quindi, anche se ricevo il lavoro @Resource, non è quello che sto cercando. –

+1

@DinushaKariyawasam Ok. BTW il '@ Resource' al livello ** class ** ha la stessa funzionalità di in' web.xml'. Quando l'applicazione viene installata, le classi vengono scansionate per le annotazioni e viene creato il file web.xml unito. È possibile visualizzare il descrittore di distribuzione unito tramite la console di amministrazione. – Gas

+0

Hai ragione! Ecco come l'ho fatto in Java 6/JEE 5 @Resource (name = "jdbc/fileUploadDS", type = javax.sql.DataSource.class) classe pubblica TestServlet estende HttpServlet { } Ho fatto riferimento a '** Dichiarazione Riferimenti sulle risorse ** 'sezione in [Documentazione Oracle] (http://docs.oracle.com/javaee/5/tutorial/doc/bnaeo.html#bnaew) e possiamo @Resource annotare qualsiasi ** Componenti Web che accettano la risorsa iniezioni ** –

1

Sto affrontando lo stesso problema. Non so come definire il tag in spring boot poiché non c'è un file web.xml nel boot di primavera.

Finora quello che ho imparato è che dobbiamo definirlo nel file dell'applicazione da cui iniziamo la nostra applicazione di primavera. Penso che abbiamo bisogno di utilizzare questo metodo per impostare l'origine dati:

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

Sono in grado di collegare il mio applicazione Primavera-Boot (distribuito in WebSphere Application Server 9) per WAS origine dati. Il seguente codice ha funzionato per me, per la connessione a DataSource:

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

Nota: Il nome di origine dati "dsName" è il nome che appare sulla UI di console di WebSphere. Puoi vederlo tramite -> Seleziona risorse> JDBC> Origini dati.

Poi ho creato template jdbc:

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

E in esecuzione query utilizzando il metodo di query funziona bene:
db2WASTemplate.query()

Non ho creato alcun Web.xml o IBM-web file -bnd.xml

0

ho appena configurato avvio di primavera con la mia origine dati personalizzata come segue:

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

e all'interno delle application.properties il file ho definito tutte le impostazioni dell'origine dati come al solito

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

Funziona bene con nessun @SpringBootApplication con tutte le altre impostazioni predefinite

Grazie