Hey Sergey,
I'm trying to follow your advice and I inherited from JSONProvider class and
just set "ignoreNamespace" to true.
At the beginning, I didn't inherit from JSONProvider, but only instantiated
this class, set the "ignoreNamespace" property and add it as a provider:
however I get an exception because this provider was already registered (by CXF
itself I guess).
SO, I add the provider bellow, but I still have the same exception about
namespace :(
In the stack trace, I see that JSONProvider is still used... Not my new
instance... I guess CXF takes the first provider which is able to handle
application/json MIME type?
Moreover, I see this warning in log:
org.apache.cxf.jaxrs.utils.ResourceUtils checkMethodDispatcher
ATTENTION: No resource methods have been found for resource class
com.test.ExtendedJSONProvider
The code of the inherited JSONProvider.
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.Provider;
import org.apache.cxf.jaxrs.provider.JSONProvider;
@Produces({"application/json"})
@Consumes({"application/json"})
@Provider
public class ExtendedJSONProvider extends JSONProvider {
public ExtendedJSONProvider() {
setIgnoreNamespaces(true);
}
}
Thanks for help!
Cheers,
Anthony
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: mardi 27 septembre 2011 12:36
To: [email protected]
Subject: Re: CXF 2.3.3 - JSON output - java.lang.IllegalStateException: Invalid
JSON namespace
Hi
The default Jettison provider expects a namespace-to-prefix map set up.
If you don't realy need the prefixes on the receiving end then the
simplest option is to configure JSONProvider with an "ignoreNamespaces"
property, otherwise you'd need to provide a map, here is more info:
http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-ConfiguringJSONprovider
The thing is how to configure it given that you are using
CXFNonSpringJAXRSServlet.
One option is to extend JSONProvider and only set "ignoreNamespace" or
"namespaceMap" property as needed on the superclass. And register it
with the servlet using a jaxrs.providers parameter.
Another option is try registering Jackson.
I should probably do some enhancement for users be able to set simple
properties on providers registered from web.xml...
Cheers, Sergey
On 27/09/11 10:41, Muller, Anthony wrote:
> Hello,
>
> I have an issue when I try to get a JSON output, using a JAXB object, of my
> REST webservice. (XML output is ok.)
>
> My webservice is running without using Spring.
>
> Can you help me? I don't know how to fix it despite browsing many websites
> from Google.
>
> Cheers,
> Anthony
>
>
> The exception is:
> javax.ws.rs.WebApplicationException: java.lang.IllegalStateException: Invalid
> JSON namespace: http://www.w3.org/2001/XMLSchema-instance
> at
> org.apache.cxf.jaxrs.provider.JSONProvider.writeTo(JSONProvider.java:291)
> at
> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:256)
> at
> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:144)
> at
> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:83)
> at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
> at
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
> at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
> at
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113)
> at
> org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:97)
> at
> org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461)
> at
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:149)
> at
> com.sap.bip.rs.server.servlet.BIPServletController.invoke(BIPServletController.java:90)
> at
> org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148)
> at
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
> at
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108)
> at
> javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
> at
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
> at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
> at
> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
> at
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
> at
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
> at
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
> at java.lang.Thread.run(Thread.java:722)
> Caused by: java.lang.IllegalStateException: Invalid JSON namespace:
> http://www.w3.org/2001/XMLSchema-instance
> at
> org.codehaus.jettison.mapped.MappedNamespaceConvention.getJSONNamespace(MappedNamespaceConvention.java:248)
> at
> org.codehaus.jettison.mapped.MappedNamespaceConvention.createAttributeKey(MappedNamespaceConvention.java:233)
> at
> org.codehaus.jettison.mapped.MappedXMLStreamWriter.writeAttribute(MappedXMLStreamWriter.java:216)
> at
> org.apache.cxf.staxutils.DelegatingXMLStreamWriter.writeAttribute(DelegatingXMLStreamWriter.java:71)
> at
> org.apache.cxf.jaxrs.provider.JSONUtils$IgnoreContentJettisonWriter.writeAttribute(JSONUtils.java:204)
> at
> org.apache.cxf.staxutils.DelegatingXMLStreamWriter.writeAttribute(DelegatingXMLStreamWriter.java:71)
> at
> com.sun.xml.internal.bind.v2.runtime.output.XMLStreamWriterOutput.attribute(XMLStreamWriterOutput.java:122)
> at
> com.sun.xml.internal.bind.v2.runtime.XMLSerializer.attribute(XMLSerializer.java:403)
> at
> com.sun.xml.internal.bind.v2.runtime.XMLSerializer.writeXsiNilTrue(XMLSerializer.java:764)
> at
> com.sun.xml.internal.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:91)
> at
> com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)
> at
> com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:664)
> at
> com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:54)
> at
> com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:157)
> at
> com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:141)
> at
> com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)
> at
> com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:561)
> at
> com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:290)
> at
> com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:462)
> at
> com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:314)
> at
> com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:161)
> at
> org.apache.cxf.jaxrs.provider.JSONProvider.marshal(JSONProvider.java:344)
> at
> org.apache.cxf.jaxrs.provider.JSONProvider.marshal(JSONProvider.java:377)
> at
> org.apache.cxf.jaxrs.provider.JSONProvider.writeTo(JSONProvider.java:283)