On Tuesday 19 April 2011 8:38:31 AM Vassilis Virvilis wrote:
> Hi
>
> I am using the cxf 2.3.6 (we haven't upgraded yet to 2.4.0) and we have the
> following exception on deploy (not in runtime)
There isn't a 2.3.6. I assume 2.3.3?
In either case, if it worked with 2.2.x, I'm actually quite surprised and
would have been completely by accident. For both JAXB and Aegis, the
interpretation of the generics is really just done for two cases (well, one
case for JAXB):
1) List<..> - both JAXB and Aegis will handle this to determine the "type" of
the list. For the most part, it's treated the same as an [] of the type.
2) Map<.. , ..> - Aegis will also look at this and create a pseudo map type
for it with key/value entries.
That's pretty much it at this point. It MAY have worked with 2.2.x as I
think 2.2.x really didn't look at any of the generics much at all. For the
most part, it would have seen the "getFirst"/"setFirst" methods on the Pair
and just treated them as the "Object" version and mapped them to xsd:any,
which is kind of a crappy schema, but it may have worked for you. Again,
purely by accident and not by design.
That all said, an NPE is definitely not what should occur. A better
exception should be generated. If you could create a small test case and
attach to a JIRA, that would be great.
Dan
>
> ERROR 2011-04-19 12:24:13,900 http-8080-8:
> org.springframework.web.context.ContextLoader.initWebApplicationContext(Co
> ntextLoader.java:220): Context initialization failed
> org.springframework.beans.factory.BeanCreationException: Error creating
> bean with name 'medline': Invocation of init method failed; nested
> exception is java.lang.NullPointerException at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
> ry.initializeBean(AbstractAutowireCapableBeanFactory.java:1420) at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
> ry.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
> ry.createBean(AbstractAutowireCapableBeanFactory.java:456) at
> org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(
> AbstractBeanFactory.java:291) at
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.get
> Singleton(DefaultSingletonBeanRegistry.java:222) at
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(Ab
> stractBeanFactory.java:288) at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(Abst
> ractBeanFactory.java:190) at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preIn
> stantiateSingletons(DefaultListableBeanFactory.java:580) at
> org.springframework.context.support.AbstractApplicationContext.finishBeanF
> actoryInitialization(AbstractApplicationContext.java:895) at
> org.springframework.context.support.AbstractApplicationContext.refresh(Abs
> tractApplicationContext.java:425) at
> org.springframework.web.context.ContextLoader.createWebApplicationContext(
> ContextLoader.java:276) at
> org.springframework.web.context.ContextLoader.initWebApplicationContext(Co
> ntextLoader.java:197) at
> org.springframework.web.context.ContextLoaderListener.contextInitialized(C
> ontextLoaderListener.java:47) at
> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.jav
> a:4135) at
> org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
> at
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java
> :791) at
> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) at
> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546) at
> org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:905) at
> org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:525) at
> org.apache.catalina.startup.HostConfig.check(HostConfig.java:1359) at
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
> 39) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm
> pl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:2
> 97) at
> com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanS
> erverInterceptor.java:836) at
> com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761) at
> org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1500)
> at
> org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:849)
> at
> org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:351)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at
> javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
> onFilterChain.java:290) at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
> Chain.java:206) at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.
> java:233) at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.
> java:191) at
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBa
> se.java:563) at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:1
> 27) at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:1
> 02) at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.ja
> va:109) at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298
> ) at
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
> at
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Ht
> tp11Protocol.java:588) at
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at
> java.lang.Thread.run(Thread.java:662)
> Caused by: java.lang.NullPointerException
> at
> org.apache.cxf.aegis.type.AbstractTypeCreator.isArray(AbstractTypeCreator.
> java:167) at
> org.apache.cxf.aegis.type.AbstractTypeCreator.createTypeForClass(AbstractT
> ypeCreator.java:113) at
> org.apache.cxf.aegis.type.AbstractTypeCreator.createType(AbstractTypeCreat
> or.java:390) at
> org.apache.cxf.aegis.type.basic.BeanTypeInfo.getType(BeanTypeInfo.java:192
> ) at
> org.apache.cxf.aegis.type.basic.BeanType.getDependencies(BeanType.java:532
> ) at
> org.apache.cxf.aegis.databinding.AegisDatabinding.addDependencies(AegisDat
> abinding.java:394) at
> org.apache.cxf.aegis.databinding.AegisDatabinding.addDependencies(AegisDat
> abinding.java:399) at
> org.apache.cxf.aegis.databinding.AegisDatabinding.addDependencies(AegisDat
> abinding.java:399) at
> org.apache.cxf.aegis.databinding.AegisDatabinding.initializeMessage(AegisD
> atabinding.java:370) at
> org.apache.cxf.aegis.databinding.AegisDatabinding.initializeOperation(Aegi
> sDatabinding.java:276) at
> org.apache.cxf.aegis.databinding.AegisDatabinding.initialize(AegisDatabind
> ing.java:239) at
> org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBi
> ndings(AbstractServiceFactoryBean.java:86) at
> org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFr
> omClass(ReflectionServiceFactoryBean.java:442) at
> org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServ
> iceModel(ReflectionServiceFactoryBean.java:505) at
> org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(Reflect
> ionServiceFactoryBean.java:242) at
> org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(Ab
> stractWSDLBasedEndpointFactory.java:101) at
> org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:14
> 8) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
> 39) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm
> pl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
> ry.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1544) at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
> ry.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1485) at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
> ry.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) ... 45 more
>
> The problem is when we try to send back classes with generics like the one
> below in the output.
>
> interface
>
> public Pair<Integer, Integer> getPair();
>
> ----------------------------------
>
>
> public class Pair<T1, T2> {
> private T1 first;
> private T2 second;
>
> public Pair(T1 first, T2 second) {
> this.first = first;
> this.second = second;
> }
>
> public Pair() {
> }
>
> public T1 getFirst() {
> return first;
> }
>
> public void setFirst(T1 first) {
> this.first = first;
> }
>
> public T2 getSecond() {
> return second;
> }
>
> public void setSecond(T2 second) {
> this.second = second;
> }
>
> @Override
> public String toString() {
> return "First: " + first + ", Second: " + second;
> }
> }
>
>
> So we thought that aegis have some problems with generic types and we did
>
> public class IntegerPair extends Pair<Integer, Integer> {
> // more bean stuff
> }
>
>
> in order to get a more concrete type but that failed with the exact same
> error.
>
> In the same breadth
> public class OurMap extends Map<Integer, Integer> {
> }
> doesn't have this problem (at least on deploy)
>
> IIRC this was working with 2.2.6 and I was wondering if this is a bug or
> intended behavior in the sense that aegis shouldn't allow this kind of use
> or is Map special?
>
> Thanks in advance
>
> Vassilis Virvilis
--
Daniel Kulp
[email protected]
http://dankulp.com/blog
Talend - http://www.talend.com