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.
-
You can reply to this email to add a comment to the issue online.