2016-06-06 8 views
1

Ich habe eine Batch-Anwendung mit Spring Batch, und ich verwende auch Spring Boot. Diese Anwendung muss Remote-EJB-Lookups durchführen, um einige Informationen vom Anwendungsserver zu laden. Bis jetzt verwendeten wir JBoss EAP 6.1. Mein pom.xml enthält ein Profil spezifisch für JBoss und ich wurde mit der folgenden Abhängigkeit:Remote-EJB-Lookup mit Spring Boot und WebSphere 8.5.5

<dependency> 
    <groupId>org.jboss.as</groupId> 
    <artifactId>jboss-as-ejb-client-bom</artifactId> 
    <version>7.2.0.Final</version> 
    <type>pom</type> 
</dependency> 

Jetzt müssen wir diese Anwendung auf WebSphere 8.5.5 migrieren. Ich habe ein neues Maven-Profil in meiner pom.xml mit den folgenden Abhängigkeiten für Remote EJB Lookup auf WebSphere erstellt.

<dependency> 
    <groupId>com.ibm.ws</groupId> 
    <artifactId>com.ibm.ws.ejb.thinclient</artifactId> 
    <version>8.5.0</version>   
    <type>pom</type> 
</dependency> 

<dependency> 
    <groupId>com.ibm.ws</groupId> 
    <artifactId>com.ibm.ws.orb</artifactId> 
    <version>8.5.0</version>   
    <type>pom</type> 
</dependency> 

Natürlich habe ich diese Gläser bereits in meinem Maven lokalen Repository installiert.

Versuchen, den Stapel erneut auszuführen, nachdem alle JNDI-Eigenschaften, Initial Context factory auf "com.ibm.websphere.naming.WsnInitialContextFactory" und Provider URL zu "corbaloc: iiop: localhost: 2817" konfiguriert wurden, bekam ich die folgende Ausnahme:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [br.com.cpqd.components.security.api.user.SecurityUser]: Factory method 'securityUserEjb' threw exception; nested exception is javax.naming.NoInitialContextException: Cannot instantiate class: com.ibm.websphere.naming.WsnInitialContextFactory [Root exception is java.lang.ClassNotFoundException: com.ibm.websphere.naming.WsnInitialContextFactory] 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
    ... 27 common frames omitted 
Caused by: javax.naming.NoInitialContextException: Cannot instantiate class: com.ibm.websphere.naming.WsnInitialContextFactory 
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674) 
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307) 
    at javax.naming.InitialContext.init(InitialContext.java:242) 
    at javax.naming.InitialContext.<init>(InitialContext.java:216) 
    at org.springframework.jndi.JndiTemplate.createInitialContext(JndiTemplate.java:136) 
    at org.springframework.jndi.JndiTemplate.getContext(JndiTemplate.java:103) 
    at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:85) 
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152) 
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179) 
    at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95) 
    at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:106) 
    at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:231) 
    at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:217) 
    at br.com.batch.common.BatchCommonConfig.securityUserEjb(BatchCommonConfig.java:101) 
    at br.com.batch.common.BatchCommonConfig$$EnhancerBySpringCGLIB$$e2167a67.CGLIB$securityUserEjb$4(<generated>) 
    at br.com.cpqd.saf.events.batch.common.BatchCommonConfig$$EnhancerBySpringCGLIB$$e2167a67$$FastClassBySpringCGLIB$$30b25502.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:309) 
    at br.com.batch.common.BatchCommonConfig$$EnhancerBySpringCGLIB$$e2167a67.securityUserEjb(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) 
    ... 28 common frames omitted 
Caused by: java.lang.ClassNotFoundException: com.ibm.websphere.naming.WsnInitialContextFactory 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:270) 
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:63) 
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:671) 
    ... 51 common frames omitted 

Ok, die Klasse wurde nicht gefunden. Um das Problem zu lösen, habe ich den Abhängigkeitstyp von WebSphere-Bibliotheken von "pom" in "jar" geändert.

Nun, ich erhalte die folgende Ausnahme:

(Leider zu diesem portugiesischen Text, aber der Fehlercode kann helfen)

**NMSV0307E**: Um nome de URL java: foi utilizado, mas a Nomenclatura não foi configurada para manipular nomes de URL java:. A causa provável é um erro do usuário ao tentar especificar um nome de URL java: em um cliente não J2EE ou no ambiente do servidor. Emitindo ConfigurationException. 

2016-06-06 14:43:18.952 WARN 18856 --- [   main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor': Invocation of init method failed; nested exception is javax.validation.ValidationException: Could not create Configuration. 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:199) 
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:615) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:465) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) 
    at br.com.cpqd.saf.events.batch.BatchProcessingBootstrap.main(BatchProcessingBootstrap.java:62) 
Caused by: javax.validation.ValidationException: Could not create Configuration. 
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:175) 
    at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:223) 
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor$Jsr303ValidatorFactory.run(ConfigurationPropertiesBindingPostProcessor.java:381) 
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.afterPropertiesSet(ConfigurationPropertiesBindingPostProcessor.java:174) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562) 
    ... 12 common frames omitted 
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
    at java.util.ArrayList.rangeCheck(ArrayList.java:635) 
    at java.util.ArrayList.get(ArrayList.java:411) 
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:173) 
    ... 17 common frames omitted 

die Fehlermeldung googeln und viele Websites zu lesen, ich Ich denke, dass Spring Boot aus irgendeinem Grund nicht zulässt, dass der eingebettete EJB-Container, der von der Datei com.ibm.ws.ejb.thinclient bereitgestellt wird, gestartet wird, aber ich bin mir nicht sicher.

Hat jemand schon versucht, das zu tun?

Antwort

0

Die IndexOutOfBoundsException ist die (schlechte) Ausnahme, die von javax.validation.Validation ausgelöst wird, wenn die API im Klassenpfad (wahrscheinlich com.ibm.ws.ejb.thinclient JAR) verfügbar ist, ein Implementierungsanbieter jedoch nicht. Laut the Spring documentation versucht die Klasse ConfigurationPropertiesBindingPostProcessor, die API javax.validation zu verwenden, wenn sie im Klassenpfad verfügbar ist.

Ich weiß Spring Boot nicht gut genug, um zu wissen, ob es eine Möglichkeit gibt, Ihr Verhalten zu deaktivieren, also würde mein bester Vorschlag auch eine javax.validation-Implementierung auf Ihrem Klassenpfad enthalten. Sie könnten beispielsweise auch die JAR-Datei com.ibm.ws.jpa.thinclient einschließen.