[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