I got that fixed, only xsi:type was blocked, now both xsi:type and
xsi:nil will be blocked if that property is set to false
Cheers, Sergey
On 03/10/11 10:51, Muller, Anthony wrote:
Hello,
I tried to remove:
final Map<String, String> namespaces = new HashMap<String, String>();
namespaces.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");
setNamespaceMap(namespaces);
And to add:
setWriteXsiType(false);
However, it failed... (same error than previous one)
Regards,
Anthony
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: lundi 3 octobre 2011 11:43
To: [email protected]
Subject: Re: CXF 2.3.3 - JSON output - java.lang.IllegalStateException: Invalid
JSON namespace
Hi
That is great, just for your info, "writeXsiType" property, if set to
false, can probably block that xsi:null...
You may also want to experiment with Jackson which is probably is less
dependent on the way JAXB operates, as opposed to Jettison
Cheers, Sergey
On 03/10/11 10:36, Muller, Anthony wrote:
Hey Sergey!
I found a solution to my issue after many attempts and after be sure that my
provider was called by CXF.
I tuned the OSGi imported packages too.
I think the problem was for interpretation of XSD Nillable value. Even if I set
'ignoreNamespaces' to 'true', nillable values are formatted like this in JSON:
"@xsi.nil"
Anyway, thanks for your help,
Anthony
@Produces({"application/json"})
@Consumes({"application/json"})
@Provider
public class ExtendedJSONProvider extends JSONProvider {
public ExtendedJSONProvider() {
setIgnoreNamespaces(true);
final Map<String, String> namespaces = new HashMap<String,
String>();
namespaces.put("http://www.w3.org/2001/XMLSchema-instance",
"xsi");
setNamespaceMap(namespaces);
}
}
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: lundi 3 octobre 2011 10:43
To: [email protected]
Subject: Re: CXF 2.3.3 - JSON output - java.lang.IllegalStateException: Invalid
JSON namespace
Hi,
I got confused a bit, as you did say
>>>>>> 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
So the problem is, that for whatever reasons, a custom provider is not
recognized when it's registered from Application.
Can you please try one of the following:
- try returning com.test.ExtendedJSONProvider.class from
Application.getClasses() but not from Application.getSingletons(); or
the other way around. I can see that either approach is being tested on
the trunk but I'm not 100% sure that that works in 2.3.3 properly
- instead of using Application - try jaxrs.serviceClasses and
jaxrs.providers init parameters - this is a temp step which may help to
isolate the problem which may be to do with @Provider being still not
visible.
- finally - create a simple bundle that can help demonstrating that the
custom provider is not picked up - and please sent to me
thanks, Sergey
On 30/09/11 16:15, Sergey Beryozkin wrote:
Hmm...
Sorry, can you please double-check that ExtendedJSONProvider does not
feature anyware in a stack trace ?
I'll add a test on my own a bit later on, I have few tests where
customized JAXB and JSON providers are used (these are effectively
overriding default ones),
Will get back to you asap - may be Monday
Thanks, Sergey
On 30/09/11 15:50, Muller, Anthony wrote:
Yep, classes are bundlized and deployed in an osgi environment.
And yes, I imported "javax.ws.rs.ext". As I said, my provider is well
instantiated but JSONProvider seems to have an higher priority.
Regards,
Anthony
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: vendredi 30 septembre 2011 15:58
To: [email protected]
Subject: Re: CXF 2.3.3 - JSON output -
java.lang.IllegalStateException: Invalid JSON namespace
Hi
I've checked that the code in CXF 2.3.3, CXF 2.4.2 and 2.5.0 that deals
with getting providers from Applications is identical and I have a test
where exception mappers are registered from CXFNonSpringJaxrsServlet and
Application.
I'm wondering if it is an OSGI issue ? Do you have javax.ws.rs.ext
imported ?
On 30/09/11 11:23, Muller, Anthony wrote:
Thanks for your help Sergey. Sorry, it's configured through an
Application instance!
Anthony
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: vendredi 30 septembre 2011 12:14
To: [email protected]
Subject: Re: CXF 2.3.3 - JSON output -
java.lang.IllegalStateException: Invalid JSON namespace
That looks OK.
How do you register it ? From Application instance or via servlet init
params ? Give me more info please
Cheers, Sergey
On 30/09/11 11:10, Muller, Anthony wrote:
Yes, it's what I did. Do you see something wrong?
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);
}
}
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: vendredi 30 septembre 2011 12:02
To: [email protected]
Subject: Re: CXF 2.3.3 - JSON output -
java.lang.IllegalStateException: Invalid JSON namespace
Hi, yea it does, but as I said CXF (CXFNonSpringJaxrsServlet) does not
check superclasses for @Provider which will need to be fixed, so for
now
please add another @Provider to your custom provider and that will do -
Cheers, Sergey
On 30/09/11 10:47, Muller, Anthony wrote:
Hi Sergey,
Are you sure that "org.apache.cxf.jaxrs.provider.JSONProvider"
doesn't have the @Provider annotation?
I found it in "cxf-2.3.3.jar" yet :-/
Anthony
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: vendredi 30 septembre 2011 11:20
To: [email protected]
Subject: Re: CXF 2.3.3 - JSON output -
java.lang.IllegalStateException: Invalid JSON namespace
Hi Anthony
How do you register it, using jaxrs.providers parameter ?
A custom provider should be preferred to a default one.
That warning suggests that you probably use a jaxrs.serviceClasses
parameter ?
Or do use register it from the Application implementation ? In that
case
this custom provider needs to have a JAX-RS @Provider annotation,
for it to be distinguished from other singletons. JSONProvider does
have
it - but in 2.3.3 no checks are made on superclasses - that will
need to
be improved in CXF
Let me know please if that works
Cheers, Sergey.
On 30/09/11 09:38, Muller, Anthony wrote:
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)