我正在尝试使用CXF 3.1.2创建一个休息服务和客户端,如下所示,
服务方法声明:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes({"application/xml", MediaType.TEXT_PLAIN})
@Path("/agentLogout")
public JSONObject agentLogout(String ext) {
JSONObject obj = new JSONObject();//org.json.simple.JSONObject
obj.put("DN", ext);
return obj;
}
客户代码:
WebClient client = WebClient.create(REST_URI); // REST_URI is configured correctly
client.path("agentLogout").accept(MediaType.TEXT_PLAIN);
Response agentLogoutResponse = client.post("10245");
System.out.println(agentLogoutResponse.readEntity(JSONObject.class));//org.json.simple.JSONObject
当我运行客户端代码时,我得到以下异常,
在服务方面:
Nov 05, 2015 3:07:08 PM org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
WARNING: javax.ws.rs.ClientErrorException: HTTP 406 Not Acceptable
在客户端:
Nov 05, 2015 3:07:08 PM org.apache.cxf.jaxrs.utils.JAXRSUtils logMessageHandlerProblem
SEVERE: No message body reader has been found for class org.json.simple.JSONObject, ContentType: */*
Exception in thread "main" javax.ws.rs.client.ResponseProcessingException: No message body reader has been found for class org.json.simple.JSONObject, ContentType: */*
请你在这里纠正我,也许我知道在CXF休息网络服务中使用Json的正确方法
答案 0 :(得分:1)
您的WS生成MediaType.APPLICATION_JSON
:
@Produces(MediaType.APPLICATION_JSON)
,您的客户希望MediaType.TEXT_PLAIN
:
client.accept(MediaType.TEXT_PLAIN);
这是“ HTTP 406不可接受”的原因。
将您的客户端更改为接受JSON,或者将服务器更改为生成文本。
此外,您无需从方法中返回JSONObject
。只需返回一个模型对象。
返回JSONObject
会使事情变得复杂,因为它将返回JSONObject
的JSON表示,它不等同于JSONObject
中包含的对象的JSON表示。
你可能会收到错误“没有找到类org.json.simple.JSONObject 的消息正文阅读器”,因为CXF不知道如何代表JSONObject
JSON。
在您的情况下,您可以使用一个条目返回Map<String,String>
:key =“DN”,value =“3254”。