You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wink.apache.org by "warren goldman (Issue Comment Edited) (JIRA)" <ji...@apache.org> on 2012/03/22 19:20:23 UTC

[jira] [Issue Comment Edited] (WINK-332) JAXBXmlProvider blocks JAXB implementation from successfully parsing XML when no concrete type can be found.

    [ https://issues.apache.org/jira/browse/WINK-332?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13235838#comment-13235838 ] 

warren goldman edited comment on WINK-332 at 3/22/12 6:19 PM:
--------------------------------------------------------------

I had a similar issue, adding @XmlRootElement to the abstract class, in addition to the xmlseealso seem to have resolved the issue...
                
      was (Author: warren@wgoldman.com):
    I had a similar issue, adding @XmlRootElement to the abstract class, in addition to the see also seem to have resolved the issue...
                  
> JAXBXmlProvider blocks JAXB implementation from successfully parsing XML when no concrete type can be found.
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: WINK-332
>                 URL: https://issues.apache.org/jira/browse/WINK-332
>             Project: Wink
>          Issue Type: Bug
>          Components: Common
>    Affects Versions: 1.1.2
>            Reporter: Kaloyan Kolev
>            Priority: Critical
>             Fix For: 1.1.2
>
>
> I have hierarchy of JAXB objects like: 
> {code}
> @XmlSeeAlso( { B.class, C.class })
> public abstract class A {}
> @XmlRootElement(name = "b")
> public class B extends A {}
> @XmlRootElement(name = "c")
> public class C extends A {}
> {code}
> My wink handler looks like:
> {code}
> @POST
> public Response create(A listener) {}
> {code}
> I am using XJC autogenerated ObjectFactory so it is a standard one based on the above hierarchy.
> At runtime I expect that clients send objects of type ex.B or ex.C, never ex.A.
> However when JAXBXmlParser's readFrom is called it is passed the type A.class. Since it tries to lookup static information it is not able to deduce the correct subclass, and thus uses class A as the concrete class. Which causes the following line: 
> {code}
> _unmarshaller.unmarshal(_xmlStreamReader, _concreteType).getValue(); 
> {code}
> to throw:
> {code}
> 2011-01-24 13:27:38,087 ERROR [org.apache.wink.common.internal.providers.entity.xml.JAXBXmlProvider] - The system cannot unmarshal the XML content into a ex.A instance.  Verify that the XML content is valid.
> java.security.PrivilegedActionException: javax.xml.bind.UnmarshalException
>  - with linked exception:
> [javax.xml.bind.UnmarshalException: Unable to create an instance of ex.A
>  - with linked exception:
> [java.lang.InstantiationException]]
> 	at org.apache.wink.common.internal.providers.entity.xml.JAXBXmlProvider$1.run(JAXBXmlProvider.java:116)
> 	at java.security.AccessController.doPrivileged(AccessController.java:251)
> 	at org.apache.wink.common.internal.providers.entity.xml.JAXBXmlProvider.readFrom(JAXBXmlProvider.java:108)
> 	at org.apache.wink.server.internal.registry.ServerInjectableFactory$EntityParam.getValue(ServerInjectableFactory.java:195)
> 	at org.apache.wink.common.internal.registry.InjectableFactory.instantiate(InjectableFactory.java:68)
> 	at org.apache.wink.server.internal.handlers.CreateInvocationParametersHandler.handleRequest(CreateInvocationParametersHandler.java:44)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> 	at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:67)
> 	at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleResourceMethod(FindResourceMethodHandler.java:151)
> 	at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleRequest(FindResourceMethodHandler.java:65)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> 	at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:67)
> 	at org.apache.wink.server.internal.handlers.FindRootResourceHandler.handleRequest(FindRootResourceHandler.java:95)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> 	at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:67)
> 	at org.apache.wink.server.internal.handlers.HeadMethodHandler.handleRequest(HeadMethodHandler.java:53)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> 	at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:67)
> 	at org.apache.wink.server.internal.handlers.OptionsMethodHandler.handleRequest(OptionsMethodHandler.java:46)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> 	at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:67)
> 	at org.apache.wink.server.internal.handlers.SearchResultHandler.handleRequest(SearchResultHandler.java:33)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> 	at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:67)
> 	at org.apache.wink.server.internal.log.ResourceInvocation.handleRequest(ResourceInvocation.java:92)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> 	at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:67)
> 	at org.apache.wink.server.internal.log.Requests.handleRequest(Requests.java:76)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
> 	at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
> 	at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:67)
> 	at org.apache.wink.server.handlers.AbstractHandlersChain.run(AbstractHandlersChain.java:52)
> 	at org.apache.wink.server.internal.RequestProcessor.handleRequestWithoutFaultBarrier(RequestProcessor.java:207)
> 	at org.apache.wink.server.internal.RequestProcessor.handleRequest(RequestProcessor.java:154)
> 	at org.apache.wink.server.internal.servlet.RestServlet.service(RestServlet.java:113)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
> 	at com.ibm.di.web.common.internal.jaxrs.JaxRsServlet.service(JaxRsServlet.java:119)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
> 	at org.eclipse.equinox.http.servlet.internal.ServletRegistration.handleRequest(ServletRegistration.java:90)
> 	at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:111)
> 	at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:67)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
> 	at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:318)
> 	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502)
> 	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:380)
> 	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
> 	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
> 	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
> 	at org.mortbay.jetty.Server.handle(Server.java:324)
> 	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:535)
> 	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:880)
> 	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:748)
> 	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:213)
> 	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
> 	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
> 	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:520)
> Caused by: javax.xml.bind.UnmarshalException
>  - with linked exception:
> [javax.xml.bind.UnmarshalException: Unable to create an instance of ex.A
>  - with linked exception:
> [java.lang.InstantiationException]]
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:415)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:342)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:319)
> 	at org.apache.wink.common.internal.providers.entity.xml.JAXBXmlProvider$1.run(JAXBXmlProvider.java:112)
> 	... 62 more
> Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of ex.A
>  - with linked exception:
> [java.lang.InstantiationException]
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:558)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:211)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:525)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:157)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiTypeLoader.startElement(XsiTypeLoader.java:49)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ProxyLoader.startElement(ProxyLoader.java:31)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:404)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:382)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:247)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:181)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:340)
> 	... 64 more
> Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of ex.A
>  - with linked exception:
> [java.lang.InstantiationException]
> 	... 75 more
> Caused by: java.lang.InstantiationException
> 	at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:42)
> 	at java.lang.reflect.Constructor.newInstance(Constructor.java:516)
> 	at com.sun.xml.internal.bind.v2.ClassFactory.create0(ClassFactory.java:95)
> 	at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.createInstance(ClassBeanInfoImpl.java:223)
> 	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:519)
> 	... 72 more
> {code}
> *If the provider is not able to find a concrete class and the base type is an abstract one it should not specify it during unmarshalling.* I have verified in a separate unit-test that JAXB implementation is perfectly capable of handling the instantiation if not enforced a base type:
> {code}
> JAXBContext ctx = JAXBContext.newInstance("ex");
> String xml = "<b></b>";
> Unmarshaller unm = ctx.createUnmarshaller();
> Object obj = unm.unmarshal(new StringReader(xml));
> if (obj instanceof JAXBElement) {
> 	obj = ((JAXBElement) obj).getValue();
> }
> assertThat(obj.getClass().getName(), is(B.class.getName()));
> {code}
> Let me know if anything else is needed.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira