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.

Reply via email to