找不到消息正文作者:JSON:Apache CXF:RestFul Webservices

问题描述:

我正在使用Apache CXF制作一个简单的宁静应用程序。我有一个客户端类,它将JSON对象发布到服务器,服务器经过一些操作后返回一个JSON。但是当我执行的代码,我得到找不到消息正文作者:JSON:Apache CXF:RestFul Webservices

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

请帮助。

我已经找到了这个很久以前,只是发布它为未来的用户。其实apache cxf(2.5.2)不支持像org.codehaus.jettison.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> 

我不确定您写的是错误是由客户端还是由REST服务生成的。另外,您的REST服务是否曾成功返回JSON(并且只是这个客户有问题),还是总是失败(表明问题出在服务上)?如果服务是问题,请在这里指向第10条:http://www.jroller.com/gmazza/entry/jersey_samples_on_cxf指出您需要添加JSON提供程序和依赖项,否则它将不知道如何处理JSON。这可能是问题。

+0

问题是,只要我执行代码,我就会得到“没有org.codehaus.jettison.json的消息正文作者”例外。我不是专家级的程序员,这是我第一次选择平静的服务。 cxf是否以我在代码中使用的方式支持json对象?我使用了泽西框架,它允许这种类型的代码没有任何错误,也没有提到我的web.xml中的任何提供者。请注意,我更喜欢非弹簧解决方案。 – Sikorski 2012-02-14 07:49:30

我有同样的问题,我正在使用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> 
+0

是的2.6发布后有一些包更改 – Sikorski 2012-12-21 06:48:02

+0

这工作..谢谢。我还需要在maven中包含垃圾依赖项 – Bhuvan 2013-06-28 07:49:09

一种不同的方法:我发现,当我改变了我的“接受”,请求头从“应用/ JSON的”到“/“然后我不再收到”无消息正文作家发现“错误消息。

对我来说,这个问题是由于转换为Jackson 2.x而出现的。并仍然希望使用CXF和JaxRS。

以上MikeLand和Sikorski的建议都为我工作。

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

CXF Migration Guide

向下滚动到 “依赖的变化。”

我只是添加所需要的依赖于你的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> 

这是花的方式长于它应该有解决这些交易之一。希望这可以帮助某人。

+0

更多详细信息,请访问:https://issues.apache.org/jira/browse/CXF-4996 此问题已在特定版本的CXF中修复。这现在正在为我工​​作。 – Blamkin86 2015-05-29 16:17:33

我也有这个问题,上述任何解决方案都不适合我。为了解决这个问题,你需要做一些我将解释的事情。

在cxf-servlet.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); 

所以在这里我有一个叫范畴类,这就是为什么我那样做了。所以现在我希望你能理解如何解决这个错误。还有一件事需要告诉网址。当您创建WebClient实例时,需要指定部署服务的位置。并使用路径向上述示例代码中添加相对路径到期望的端点。