2014-12-15 21 views
5

Bir WAR dosyası olarak dağıtmak için bir önyükleme (v 1.1.9) uygulaması kurdum. Ve bu web uygulamasını mevcut bir veri hizmeti modülü ile entegre etmeye çalışıyorum (maven bağımlılığı olarak eklendi).Spring boot JNDI veri kaynağı hatası - Name comp/env/jdbc bağlamda bulunamadı "java:"

Çevre dağıtmak için çalışıyor: WebSphere Application Server 8.5.5.4

karşılaştığım sorunu deneyin bakmak için-bir Jndi dataSource (jdbc/fileUploadDS) bir uygulama başlatma başarısızlık Bağlı veri hizmeti modülünde aşağıdaki gibi.

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

} 

Benim Bahar Önyükleme yapılandırması: başarıyla sahne/FileUploadProperties arama açabiliyorum

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

} 

Not. Ancak bir veri kaynağı için aynısını yapmamak.

Şüphem, istediğim gibi olmayan bir EmbeddedWebApplicationContext yüklemeye çalışıyor.

yığın izleme: Ben burada eksik

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) 

? SampleApplication.java'daki dataSource bean yöntemini açık olarak tanımlamaya çalıştığımda bile, aynı hatayla başarısız olur.

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

Ben this sevk ve biz servlet konteyner üzerinde enableNaming() ayarlamanız gerekir diyor? Gömülü olmayan web uygulaması içeriği için benzer bir şey yapabilir miyim? Veya tamamen bir WAS 8.5 sorun mu?

+0

Eğer 'JndiObjectFactoryBean denediniz Diğer tüm varsayılan ayarlarla @SpringBootApplication ile hiçbir güzel çalışır

Teşekkür zamanki

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

gibi tüm veri kaynağı ayarlarını tanımlanmış dosya Java: comp/env/'bölümünden? –

+0

"web.xml" inizde jdbc/fileUploadDS ismi ile kaynak referansınızın olması gerekir. Ve yükleme sırasında veya "ibm-web-bnd.xml" dosyası aracılığıyla gerçek veri kaynağı adına bağlı olduğundan emin olun. – Gas

+1

Teşekkürler @Gas çalışıyor. Web.xml dosyasında resource-ref dosyasını ekledim ve WAS admin konsolunda kurulum yaparken kaynak referansını gerçek veri kaynağına bağladım. Ama benim bahar önyükleme uygulamasında bir web.xml olmadan aynı nasıl elde edebilirim? Ben [burada] (http://docs.spring.io/autorepo/docs/spring-boot/current-SNAPSHOT/reference/html/howto-traditional-deployment.html) , nasıl değiştirileceğini okudum veya SpringBootServletInitializer'ı genişleten bahar önyükleme yapılandırma sınıfında veya . için de bir eşdeğer var mı? –

cevap

7

jdbc/fileUploadDS adında web.xml adında kaynak başvurusu olması gerekir. Ve yükleme sırasında veya ibm-web-bnd.xml dosya aracılığıyla gerçek veri kaynağı adına bağlı olduğundan emin olun.

Tanımı web.xml yılında:

@Resource(name="jdbc/fileUploadDS", type=javax.sql.DataSource.class, lookup="jdbc/fileUploadDS") 
: Normal bir Java EE uygulamasında ardından web.xml, kullanmak istemiyorum Eğer

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

sadece web bileşeni (servlet, filtre) aşağıdaki sınıf açıklama ekleyebilirim

fakat Spring-önyükleme uzmanı değilim, o yüzden işe yarayacak ya da orada mümkün değilse.

+0

Daha önce de belirttiğim gibi, kaynak önyükleme uygulamasında dataSource'u aramaya gerek duymadığımdan, harici bir bağımlılık içinde gereksinimime uyan tek seçenek. Bu yüzden, @Resource çalışmasına rağmen, peşindeyim değil. –

+1

@DinushaKariyawasam Ok. BTW the ** class ** düzeyinde, @ web.xml'de ile aynı işleve sahiptir. Uygulama yüklendiğinde, sınıflar ek açıklamalar için taranır ve birleştirilmiş web.xml oluşturulur. Birleştirilmiş dağıtım tanımlayıcısını yönetici konsolu aracılığıyla görebilirsiniz. – Gas

+0

Haklısınız! Java 6/JEE 5 @Resource'da (name = "jdbc/fileUploadDS", tür = javax.sql.DataSource.class) genel sınıf TestServlet, HttpServlet { } uzantısını şöyle ifade etti: '** Bildiriyor Kaynak Referanslar ** '[Oracle belgelerinde] bölümü (http://docs.oracle.com/javaee/5/tutorial/doc/bnaeo.html#bnaew) ve kaynak kodunu kabul eden herhangi bir ** Web Bileşenine @Resource ekleyebiliriz Enjeksiyonlar ** –

1

Aynı sorunla karşı karşıyayım. Yay önyüklemesinde web.xml dosyası bulunmadığından, ilkbahar etiketinde etiketi nasıl tanımlayacağımı bilmiyorum.

Şimdiye kadar ne öğrendiğime göre uygulama dosyasında, bahar uygulamamızı başlattığımız yerden tanımlamamız gerekiyor. Bence Datasource'u ayarlamak için bu yöntemi kullanmaya ihtiyacım var:

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

Ben WAS veri kaynağı için (Websphere Application Server 9 konuşlandırılan) benim İlkbahar-Boot uygulamasını bağlantı kurabiliyorum. Aşağıdaki kod DataSource bağlanmak için, benim için çalıştı:

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

Not: Veri kaynağı "DSNAME" adı Websphere konsolun UI görünen addır. Bunu -> Kaynak Seç> JDBC> Veri Kaynakları ile görebilirsiniz.

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

Ve sorgu yöntemiyle sorgu çalıştıran çalışıyor:

Sonra jdbc şablon oluşturdu
db2WASTemplate.query()

herhangi Web.xml veya ibm-web yaratmadı

-bnd.xml dosyalar

0

şöyle sadece özel veri kaynağı ile bahar çizme yapılandırılan:

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

ve application.properties içBen