无法使用org.json.simple.JSONObject访问其余的CXF

时间:2015-11-05 09:44:35

标签: java json web-services rest cxf

我正在尝试使用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的正确方法

1 个答案:

答案 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”。