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 manipulation. but when i execute the code i get
"org.apache.cxf.interceptor.Fault: .No message body writer has been found for class:
class org.codehaus.jettison.json.JSONObject, ContentType : application/json."
My client code :
public class Client {
public static void main(String[] args) {
try{
URI uri = new URI("http://localhost:8022/RestDemo");
WebClient client = WebClient.create(uri);
String ret = client.path("rest").path("server").path("welcome").accept(MediaType.TEXT_PLAIN).get(String.class);
System.out.println(ret);
JSONObject json = new JSONObject();
json.put("name", "ronaldo");
json = client.path("rest").path("server").path("op").type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).post(json, JSONObject.class);
System.out.println(json);
System.out.println(json.has("reverse")?json.getString("reverse"):"dont have");
}catch(Exception e){
System.out.println("e"+e.getLocalizedMessage());
e.printStackTrace();
}
}
}
Please help.
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>
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.
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.
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.
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
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.
来源:https://stackoverflow.com/questions/9256112/no-message-body-writer-found-json-apache-cxf-restful-webservices