You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wink.apache.org by "Kaloyan Kolev (JIRA)" <ji...@apache.org> on 2011/01/24 13:15:43 UTC

[jira] Created: (WINK-332) JAXBXmlProvider blocks JAXB implementation from successfully parsing XML when no concrete type can be found.

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.


[jira] [Issue Comment Edited] (WINK-332) JAXBXmlProvider blocks JAXB implementation from successfully parsing XML when no concrete type can be found.

Posted by "warren goldman (Issue Comment Edited) (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WINK-332?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13235838#comment-13235838 ] 

warren goldman edited comment on WINK-332 at 3/22/12 6:19 PM:
--------------------------------------------------------------

I had a similar issue, adding @XmlRootElement to the abstract class, in addition to the xmlseealso seem to have resolved the issue...
                
      was (Author: warren@wgoldman.com):
    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

        

[jira] [Commented] (WINK-332) JAXBXmlProvider blocks JAXB implementation from successfully parsing XML when no concrete type can be found.

Posted by "warren goldman (Commented) (JIRA)" <ji...@apache.org>.
    [ 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