[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wink-dev
Subject:    [jira] [Updated] (WINK-332) JAXBXmlProvider blocks JAXB implementation from successfully parsing XML
From:       "Luciano Resende (JIRA)" <jira () apache ! org>
Date:       2013-11-03 21:41:20
Message-ID: JIRA.12496526.1295871309221.13565.1383514880013 () arcas
[Download RAW message or body]


     [ https://issues.apache.org/jira/browse/WINK-332?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel \
]

Luciano Resende updated WINK-332:
---------------------------------

    Fix Version/s:     (was: 1.4)
                   1.5

> 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.5
> 
> 
> 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 was sent by Atlassian JIRA
(v6.1#6144)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic