2014-12-15 43 views
5

Mam zainstalowaną aplikację rozruchową wiosennego (v 1.1.9) do wdrożenia jako plik WAR. Próbuję zintegrować tę aplikację internetową z istniejącym modułem usług danych (dodanym jako zależność od maven).Wiosenne uruchamianie niepowodzenia wyszukiwania źródła danych JNDI - nazwa comp/env/jdbc nie została znaleziona w kontekście "java:"

Środowisko próbuje wdrożyć: Serwer WebSphere Application 8.5.5.4

Kwestia jestem stoi to niepowodzenie aplikacja rozruch podczas próby look-up z JNDI źródła danych (JDBC/fileUploadDS) jak poniżej w module usług danych zależnych.

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

} 

Moja Wiosna konfiguracja 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(); 
    } 

} 

Zauważ, że jestem w stanie do wyszukiwania rekwizyty/FileUploadProperties pomyślnie. Ale nie udało się zrobić tego samego dla źródła danych.

Moja wątpliwość polega na tym, że próbuję załadować EmbeddedWebApplicationContext, co nie jest tym, czego chcę.

Ślad stosu jest:

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) 

Co ja tu brakuje? Nawet gdy próbuję jawnie zdefiniować metodę bean źródła danych w SampleApplication.java, jak poniżej, kończy się to niepowodzeniem z tym samym błędem.

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

odniosłem this i mówi, musimy ustawić enableNaming() w kontenerze serwletów? Czy mogę zrobić coś podobnego w przypadku nie osadzonego kontekstu aplikacji internetowej? Czy jest to czysto WAS 8.5?

+0

Czy próbował 'JndiObjectFactoryBean 'BEZ części' java: comp/env/'? –

+0

Potrzebne jest odniesienie do zasobu z nazwą 'jdbc/fileUploadDS' w twoim' web.xml'. Upewnij się, że jest on powiązany z rzeczywistą nazwą źródła danych podczas instalacji lub poprzez plik 'ibm-web-bnd.xml'. – Gas

+1

Dzięki @Gas to działa. Dodałem odwołanie do zasobu w pliku web.xml i powiązałem odwołanie do faktycznego źródła danych podczas instalacji w konsoli administracyjnej WAS. Ale w jaki sposób osiągnąć to samo bez web.xml w mojej aplikacji wiosennej? Przeczytałem [tutaj] (http://docs.spring.io/autorepo/docs/spring-boot/current-SNAPSHOT/reference/html/howto-traditional-deployment.html) jak zastąpić , lub , w klasie konfiguracji rozruchu sprężystego rozszerzającej SpringBootServletInitializer. Czy istnieje również odpowiednik dla ? –

Odpowiedz

7

Musisz mieć odniesienie do zasobu o nazwie jdbc/fileUploadDS w swoim web.xml. Upewnij się, że jest on powiązany z rzeczywistą nazwą źródła danych podczas instalacji lub poprzez plik ibm-web-bnd.xml.

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

jeśli nie chcesz używać web.xml, następnie w normalnej aplikacji Java EE można po prostu dodać w składniku internetowej (serwletu, filtr) dodaje klasy adnotacji:

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

ale nie jestem ekspertem od wiosennego rozruchu, więc nie wiem, czy to zadziała, czy jest możliwe.

+0

Jak już wspomniałem, dodanie jest jedyną opcją, która pasuje do moich wymagań, ponieważ nie potrzebuję sprawdzać źródła danych w aplikacji rozruchowej, ale w ramach zależności zewnętrznej. Więc nawet jeśli działam na @Resource, to nie jest to, o co prosiłem. –

+1

@ DinushaKariyawasam Ok. BTW "@ Resource" na poziomie ** klasy ma taką samą funkcjonalność jak w 'web.xml'. Po zainstalowaniu aplikacji klasy są skanowane pod kątem adnotacji i tworzony jest scalony plik web.xml. Możesz zobaczyć scalony deskryptor wdrażania za pomocą konsoli administracyjnej. – Gas

+0

Masz rację! To jak to zrobiłem w Javie 6/JEE 5 @Resource (name = "jdbc/fileUploadDS", type = javax.sql.DataSource.class) public class TestServlet rozszerza HttpServlet { } Odwołałem się do '** Deklaracji Referencje zasobów ** "w [Dokumentacja Oracle] (http://docs.oracle.com/javaee/5/tutorial/doc/bnaeo.html#bnaew) i możemy @Resource opisywać dowolne ** Komponenty sieci Web, które akceptują zasoby Zastrzyki ** –

1

Mam do czynienia z tym samym problemem. Nie wiem, jak zdefiniować tag w rozruchu wiosennym, ponieważ nie ma pliku web.xml w wiosennym rozruchu.

Do tej pory dowiedziałem się, że musimy to zdefiniować w pliku wniosku, od którego rozpoczynamy naszą aplikację wiosenną. Myślę, że musimy skorzystać z tej metody, aby ustawić źródło danych:

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

jestem w stanie połączyć mój wniosek Wiosna-Boot (wdrożony w produkcie WebSphere Application Server 9) do WAS źródła danych. Poniższy kod pracował dla mnie, do podłączenia do źródła danych:

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

Uwaga: nazwa źródła danych „DSNAME” to nazwa, która pojawia się w interfejsie konsoli WebSphere. Możesz to zobaczyć za pomocą -> Wybierz zasoby> JDBC> Źródła danych.

Potem stworzył jdbc szablonu:

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

i uruchamianie kwerendy przy użyciu metody kwerenda działa prawidłowo:
db2WASTemplate.query()

nie tworzy żadnego web.xml lub IBM-web pliki -bnd.xml

0

właśnie skonfigurowany rozruch sprężyny z moim niestandardowego źródła danych w następujący sposób:

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

i wewnątrz application.properties złożyć zdefiniowałem wszystkie ustawienia źródła danych jak zwykle

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

Działa nie ładnie z @SpringBootApplication ze wszystkimi innymi ustawieniami domyślnymi

Dzięki