WARファイルとしてデプロイするためのSpring Boot(v 1.1.9)アプリケーションをセットアップしました。そして、このWebアプリケーションを既存のデータサービスモジュール(Maven依存関係として追加された)と統合しようとしています。
デプロイしようとしている環境:WebSphere Application Server 8.5.5.4
私が直面している問題は、依存関係内でJNDI dataSource(jdbc/fileUploadDS)をルックアップしようとすると、アプリケーションの起動に失敗することですデータサービスモジュール。
@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");
}
}
私のSpring Boot構成:
@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();
}
}
Props/FileUploadPropertiesを正常に検索できることに注意してください。しかし、データソースに対して同じことを行うことに失敗しました。
私の疑問は、EmbeddedWebApplicationContextを読み込もうとしていることです。
スタックトレースは次のとおりです:
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でdataSource Beanメソッドを明示的に定義しようとしても、同じエラーで失敗します。
@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();
}
私は this を参照しましたが、サーブレットコンテナにenableNaming()を設定する必要があると言っていますか?埋め込まれていないWebアプリケーションコンテキストに対して同様のことができますか?それとも純粋にWAS 8.5の問題ですか?
jdbc/fileUploadDS
にweb.xml
の名前のリソース参照が必要です。また、インストール時またはibm-web-bnd.xml
ファイルを介して実際のデータソース名にバインドされていることを確認してください。
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>
web.xml
を使用したくない場合は、通常Java EEアプリでは、次のクラスアノテーションをWebコンポーネント(サーブレット、フィルター)に追加するだけです):
@Resource(name="jdbc/fileUploadDS", type=javax.sql.DataSource.class, lookup="jdbc/fileUploadDS")
しかし、私はSpring-bootの専門家ではないので、それが機能するか、それが可能かどうかはわかりません。
(Websphere Application Server 9にデプロイされた)Spring-BootアプリケーションをWASデータソースに接続できます。次のコードは、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);
}
注:データソースの名前「DSNAME」は、WebsphereコンソールのUIに表示される名前です。 -> [リソース]> [JDBC]> [データソース]から確認できます。
次に、jdbcテンプレートを作成しました。
@Autowired
@Qualifier("WASDataSourceJdbcTemplate")
private JdbcTemplate db2WASTemplate;`
そして、queryメソッドを使用してクエリを実行すると正常に動作します:
db2WASTemplate.query()
Web.xmlまたはibm-web-bnd.xmlファイルを作成していません
私も同じ問題に直面しています。春のブートにはweb.xmlファイルがないため、春のブートでタグを定義する方法がわかりません。
これまでのところ、Springアプリケーションを開始するアプリケーションファイルで定義する必要があることを知りました。 Datasourceを設定するには、このメソッドを使用する必要があると思います。
@Bean(destroyMethod="")
@ConfigurationProperties(prefix="datasource.mine")
public DataSource dataSource() throws Exception {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
return dataSourceLookup.getDataSource("Java:jdbc/configurationFile");
}
次のように、カスタムデータソースでスプリングブートを構成しました。
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
そしてapplication.propertiesファイル内で、いつものようにすべてのデータソース設定を定義しました
spring.datasource.driver-class-name= ***
spring.datasource.url= ***
spring.datasource.username= ***
spring.datasource.password= ***
spring.datasource.jndi-name=jdbc/myDB
他のすべてのデフォルト設定で@SpringBootApplicationを使用するとうまく機能しません
ありがとう