Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No message body writer found : JSON : Apache CXF : RestFul Webservices

Tags:

java

json

cxfrs

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.

like image 960
Sikorski Avatar asked Feb 13 '12 05:02

Sikorski


3 Answers

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>
like image 173
mikeland Avatar answered Sep 28 '22 11:09

mikeland


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>
like image 27
Sikorski Avatar answered Sep 28 '22 09:09

Sikorski


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.

like image 26
GPrathap Avatar answered Sep 28 '22 11:09

GPrathap