I am using Apache CXF for making a simple restful application. I have a client class which posts a JSON object to the server and server returns back a JSON after some manipu
For me, this issue came up as a result of converting to Jackson 2.x. and still wanting to use CXF with JaxRS.
The above suggestions from MikeLand and Sikorski worked for me.
The migration guide actually discusses this
CXF Migration Guide
Scroll down to "Dependency Changes."
I'm just adding the required dependencies for your Maven pom.xml file:
<!-- for JSON provider -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- for extension providers -->
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.2</version>
</dependency>
This is one of those deals that took way longer than it should have to resolve. Hopefully this willl help someone.
I'm not sure from your writing whether the error is being generated by the client or the REST service. Also, does your REST service ever successfully return JSON (and it's just this client with the trouble) or is it always failing (indicating the problem is with the service)? If the service is the problem, point #10 here: http://www.jroller.com/gmazza/entry/jersey_samples_on_cxf notes that you'll need to add in a JSON provider and dependency as shown, else it won't know how to process JSON. That might be the issue.
I had the same problem and I am using CXF 2.7. The org.apache.cxf.jaxrs.provider.JSONProvider
has been changed to org.apache.cxf.jaxrs.provider.json.JSONProvider
So the jaxrs
provider is:
<jaxrs:providers>
<bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
<property name="dropRootElement" value="true" />
<property name="supportUnwrapped" value="true" />
</bean>
</jaxrs:providers>
I had found this long back ago, just posting it for future users. Actually apache cxf(2.5.2) doesn't support raw JSON objects like org.codehaus.jettison.JSONObject. For using JSON in requests and responses, I used pojos(simply getters and setters with JAXB annotations) and apache cxf json provider i.e. org.apache.cxf.jaxrs.provider.JSONProvider. Following is my configuration :
<jaxrs:providers>
<bean class="org.apache.cxf.jaxrs.provider.JSONProvider">
<property name="dropRootElement" value="true" />
<property name="supportUnwrapped" value="true" />
</bean>
</jaxrs:providers>
A different approach: I found that when I changed my "Accept" request header from "application/json" to "/" then I no longer received the "No message body writer found" error message.
I also had this problem, any of above solutions didn't work for me. Inorder to resolve this issue you need to do a couple of things which I will explain.
In cxf-servlet.xml(server configuration) one of json providers needs to be provided.
<jaxrs:server id="categoryRESTService" address="/api">
<jaxrs:features>
<cxf:logging/>
</jaxrs:features>
<jaxrs:serviceBeans>
<ref bean="categoryService" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider"/>
</jaxrs:providers>
</jaxrs:server>
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
In the client, it can be configured using spring or source code itself. Here is the how it is done in source code itself.
WebClient client = WebClient.create("http://localhost:9763/services/api/", Collections.singletonList(new JacksonJsonProvider()))
.path("categoryservice/category/001").accept(MediaType.APPLICATION_JSON_TYPE);
Category category = client.get(Category.class);
So here I have a class called Category, that is why I have done in that way. So now I hope you could understand how to resolve this error. One more thing needs to tell about URLs. When you create a WebClient instance need to give where is the service is deployed.And add a relative path to the desired endpoint using path as shown above example code.