[ 
https://issues.apache.org/jira/browse/GERONIMO-3793?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12563649#action_12563649
 ] 

Jarek Gawor commented on GERONIMO-3793:
---------------------------------------

This is actaully more convoluted that I initially thought.

OpenEJB creates a URLClassLoader initialized with a temporary file created 
during deployment (OpenEJB_Generated_*). That URLClassLoader has the parent set 
to the application classloader. When the EJB WS is invoked the URLClassLoader 
is set on the thread. The test fails when the context classloader is set to the 
URLClassLoader but works fine when it is set to application classloader. 
Now, becuase there is no ObjectFactory.java or package-info.java classes 
present, Axis2 tries to discover the classes to include in the JAXBContext by 
scanning the jar files. To get the list of jar files to scan, it calls 
URLClassLoader.getURLs(). The OpenEJB generated URLClassLoader will return only 
one jar file that points to that temporary file. And since the file is empty in 
this case, the discovery will fail and no files will be included in the JAXB 
context. That explains why the test passes and fails with different context 
classloaders. 

So possible solutions/ideas are to:

1) Create ObjectFactory.java, package-info.java classes to help Axis2 add 
classes to JAXB context
2) Force for WS-calls, the application classloader instead of the OpenEJB 
generated one. But I'm afraid this will cause problems in some other cases.
3) Improve Axis2 class finding algorithm to consider parents classloaders. 
Looks like should be fairly easy to do but not sure about the effort since this 
problem does not exist in 2.1-SNAPSHOT. 
4) ???



> "Not Known To This Context" JAXBException when attempting to return complex 
> data type from a @WebMethod
> -------------------------------------------------------------------------------------------------------
>
>                 Key: GERONIMO-3793
>                 URL: https://issues.apache.org/jira/browse/GERONIMO-3793
>             Project: Geronimo
>          Issue Type: Bug
>      Security Level: public(Regular issues) 
>          Components: webservices
>         Environment: Windows XP x86-32, IBM J9 1.5.0 SR5, Geronimo w/ 
> Tomcat+OpenEJB+Axis2
>            Reporter: Cedric Hurst
>            Assignee: Jarek Gawor
>             Fix For: 2.0.x
>
>         Attachments: ComplexDataTypeWSExampleEAR.ear, geronimo.log
>
>
> I'm attempting to return a @XmlRootElement annotated object called "Customer" 
> from a @WebMethod.  When calling the service, I get the following error in 
> the server log:
> javax.xml.bind.JAXBException: 
> [Lcom.gmail.at.cedrichurst.complexDataTypeWSExampleEJB.domain.Customer; is 
> not known to this context
>       at 
> com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:223)
>       at 
> com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:238)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:85)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:127)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:244)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:251)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:33)
>       at 
> com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:461)
>       at 
> com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:292)
>       ... 48 more
> From what I understand, the return type should be added to the JaxB context 
> automatically.
> Just to make sure I wasn't doing something wrong in my Customer class, I 
> added another method to my bean that returned a java.util.List of Strings.  
> When calling this method, I also got the same sort of error:
> [javax.xml.bind.JAXBException: java.util.List is not known to this context]
> javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException
>  - with linked exception:
> [javax.xml.bind.JAXBException: java.util.List is not known to this context]
>       at 
> org.apache.axis2.jaxws.ExceptionFactory.createWebServiceException(ExceptionFactory.java:174)
>       at 
> org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:69)
>       at 
> org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:127)
>       at 
> org.apache.axis2.jaxws.message.databinding.impl.JAXBBlockImpl$2.run(JAXBBlockImpl.java:405)
>       at 
> org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:76)
>       at 
> org.apache.axis2.jaxws.message.databinding.impl.JAXBBlockImpl.marshalByType(JAXBBlockImpl.java:321)
>       at 
> org.apache.axis2.jaxws.message.databinding.impl.JAXBBlockImpl._outputFromBO(JAXBBlockImpl.java:209)
>       at 
> org.apache.axis2.jaxws.message.impl.BlockImpl.outputTo(BlockImpl.java:327)
>       at 
> org.apache.axis2.jaxws.message.impl.BlockImpl.serialize(BlockImpl.java:252)
>       at 
> org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerializeAndConsume(OMSourcedElementImpl.java:599)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:785)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:814)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:785)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:814)
>       at 
> org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.serializeInternally(SOAPEnvelopeImpl.java:237)
>       at 
> org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:225)
>       at 
> org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:814)
>       at 
> org.apache.axiom.om.impl.llom.OMNodeImpl.serializeAndConsume(OMNodeImpl.java:421)
>       at 
> org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:68)
>       at 
> org.apache.axis2.transport.http.CommonsHTTPTransportSender.sendUsingOutputStream(CommonsHTTPTransportSender.java:294)
>       at 
> org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:211)
>       at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:396)
>       at 
> org.apache.geronimo.axis2.ejb.EJBInterceptor.intercept(EJBInterceptor.java:94)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:615)
>       at 
> org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:146)
>       at 
> org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:129)
>       at 
> org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:73)
>       at 
> org.apache.openejb.core.stateless.StatelessContainer.invokeWebService(StatelessContainer.java:263)
>       at 
> org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:199)
>       at 
> org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:165)
>       at 
> org.apache.geronimo.axis2.ejb.EJBMessageReceiver.receive(EJBMessageReceiver.java:88)
>       at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:145)
>       at 
> org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
>       at 
> org.apache.geronimo.axis2.Axis2WebServiceContainer.processPOSTRequest(Axis2WebServiceContainer.java:395)
>       at 
> org.apache.geronimo.axis2.Axis2WebServiceContainer.doService2(Axis2WebServiceContainer.java:265)
>       at 
> org.apache.geronimo.axis2.Axis2WebServiceContainer.doService(Axis2WebServiceContainer.java:204)
>       at 
> org.apache.geronimo.axis2.Axis2WebServiceContainer.invoke(Axis2WebServiceContainer.java:167)
>       at 
> org.apache.geronimo.tomcat.TomcatEJBWebServiceContext$EJBWebServiceValve.invoke(TomcatEJBWebServiceContext.java:180)
>       at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>       at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>       at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>       at 
> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
>       at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
>       at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
>       at 
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
>       at 
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>       at java.lang.Thread.run(Thread.java:801)
> According to a thread in the OpenEJB mailing list:
> http://www.nabble.com/Returning-complex-data-types-in-%40WebResult-tc15114306.html
> ...it doesn't seem that these errors should be happening.
> I attempted to test this under CXF, but ran into another issue which is 
> outlined in another JIRA.
> EAR file and geronimo.log attached.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to