5

我正在使用 Apache CXF 来制作一个简单的宁静应用程序。我有一个客户端类,它将一个 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();
    }
}
}

请帮忙。

4

6 回答 6

10

我有同样的问题,我正在使用 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>
于 2012-12-20T22:44:59.377 回答
5

我很久以前就发现了这个,只是将它发布给未来的用户。实际上 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>
于 2012-04-24T07:36:18.467 回答
3

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

在 cxf-servlet.xml(server configuration) 中,需要提供 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);

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

于 2015-10-26T09:59:47.230 回答
0

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

于 2012-02-13T19:17:47.847 回答
0

另一种方法:我发现当我将“接受”请求标头从“应用程序/json”更改为“ / ”时,我不再收到“未找到消息正文编写器”错误消息。

于 2014-01-16T17:42:18.770 回答
0

对我来说,这个问题是由于转换为 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>   

这是那些花费比它应该解决的时间更长的交易之一。希望这会帮助某人。

于 2015-05-28T20:49:20.237 回答