[ 
https://issues.apache.org/jira/browse/WINK-332?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13235838#comment-13235838
 ] 

warren goldman commented on WINK-332:
-------------------------------------

I had a similar issue, adding @XmlRootElement to the abstract class, in 
addition to the see also seem to have resolved the issue...
                
> 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.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to