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

List:       wink-dev
Subject:    [jira] Created: (WINK-332) JAXBXmlProvider blocks JAXB
From:       "Kaloyan Kolev (JIRA)" <jira () apache ! org>
Date:       2011-01-24 12:15:43
Message-ID: 6901291.152121295871343931.JavaMail.jira () thor
[Download RAW message or body]

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.


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

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