未找到消息正文编写器:JSON:Apache CXF:RestFul Webservices



我使用Apache CXF来制作一个简单的restful应用程序。我有一个客户端类,它向服务器发布一个JSON对象,服务器在进行一些操作后返回一个JSON。但当我执行代码时,我会得到

"org.apache.cxf.interceptor.Fault: .No message body writer has been found for class:           
 class org.codehaus.jettison.json.JSONObject, ContentType : application/json."

我的客户代码:

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();
    }
}
}

请帮忙。

我遇到了同样的问题,我使用的是CXF 2.7。org.apache.cxf.jaxrs.provider.JSONProvider已更改为org.apache.cxf.jaxrs.provider.json.JSONProvider

因此jaxrs提供商是:

<jaxrs:providers>
    <bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
        <property name="dropRootElement" value="true" />
        <property name="supportUnwrapped" value="true" />
    </bean>
</jaxrs:providers>

我很久以前就发现了这个,只是为未来的用户发布它。实际上,apache cxf(2.5.2)不支持像org.codehaus.settison.JSONObject这样的原始JSON对象。为了在请求和响应中使用JSON,我使用了pojos(简单地说是带有JAXB注释的getter和setter)和apache cxf-JSON提供程序,即org.apache.cxf.jaxrs.provider.JSONProvider。以下是我的配置:

<jaxrs:providers>
    <bean class="org.apache.cxf.jaxrs.provider.JSONProvider">
        <property name="dropRootElement" value="true" />
        <property name="supportUnwrapped" value="true" />
    </bean>
</jaxrs:providers>

我也遇到了这个问题,上面的任何解决方案都不适用于我。为了解决这个问题,你需要做一些事情,我将对此进行解释。

在cxfservlet.xml(服务器配置)中,需要提供一个json提供程序。

         <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"/>

在客户端中,可以使用spring或源代码本身对其进行配置。以下是如何在源代码中完成的。

 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);

所以这里我有一个类,叫做类别,这就是为什么我会这样做。所以现在我希望你能理解如何解决这个错误。关于URL还有一点需要说明。创建WebClient实例时,需要提供服务的部署位置。并使用path添加到所需端点的相对路径,如上面的示例代码所示。

从您的写作中,我不确定错误是由客户端还是REST服务生成的。另外,您的REST服务是否成功地返回了JSON(只是这个客户端出现了问题),还是总是失败(表明问题出在服务上)?如果服务是问题所在,请在此处指出第10点:http://www.jroller.com/gmazza/entry/jersey_samples_on_cxf注意,您需要添加一个JSON提供程序和依赖项,如图所示,否则它将不知道如何处理JSON。这可能就是问题所在。

另一种方法:我发现,当我将"Accept"请求标头从"application/json"更改为"/"时,我不再收到"找不到消息正文编写器"错误消息。

对我来说,这个问题是由于转换到Jackson 2.x并且仍然希望将CXF与JaxRS一起使用而产生的。

MikeLand和Sikorski的上述建议对我很有效。

迁移指南实际上讨论了这个

CXF迁移指南

向下滚动至"相关性更改"。

我只是为您的Maven pom.xml文件添加所需的依赖项:

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

这是一笔花费了比它应该解决的时间长得多的交易。希望这能帮助到别人。

最新更新