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

前提是你 提交于 2019-12-01 05:23:42
mikeland

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>
Sikorski

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

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.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!