[英]Apache CXF as Client for restful API - No message body writer has been found for class
[英]No message body writer found : 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.jettison.JSONObject这样的原始JSON对象。 为了在请求和响应中使用JSON,我使用了pojos(简单的getter和setter with JAXB annotations)和apache cxf json provider ieg.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>
我也有这个问题,上述任何解决方案都不适用于我。 为了解决这个问题,你需要做一些我要解释的事情。
在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);
所以这里有一个名为Category的类,这就是我这样做的原因。 所以现在我希望你能理解如何解决这个错误。 还有一件事需要讲述URL。 创建WebClient实例时,需要提供部署服务的位置。并使用路径添加到所需端点的相对路径,如上面的示例代码所示。
一种不同的方法:我发现当我将“接受”请求标题从“application / json”更改为“ / ”时,我不再收到“No message body writer found”错误消息。
对我来说,这个问题是由于转换为Jackson 2.x而出现的。 并且仍然希望将CXF与JaxRS一起使用。
MikeLand和Sikorski的上述建议为我工作。
迁移指南实际上讨论了这一点
向下滚动到“依赖关系更改”。
我只是为您的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>
这是一项比预期更长的交易之一。 希望这会帮助某人。
我不确定您的写作是由客户端还是REST服务生成错误。 此外,您的REST服务是否成功返回JSON(并且它只是这个客户端遇到了麻烦)或者它总是失败(表明问题出在服务上)? 如果服务有问题,请点击此处的第10条: http : //www.jroller.com/gmazza/entry/jersey_samples_on_cxf注意到您需要添加JSON提供程序和依赖项,如图所示,否则它将不知道如何处理JSON。 这可能是个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.