从Rest-Webservice发送Json [Gson实现]

时间:2014-03-25 11:43:40

标签: java json web-services gson

我正在使用Gson库来处理将Json解析为java实体,反之亦然。 现在,在处理完之后需要将Json对象返回给调用者。 但这样做会导致以下异常:

Mar 25, 2014 4:46:30 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: A message body writer for Java class com.google.gson.JsonObject, and Java type class com.google.gson.JsonObject, and MIME media type application/json was not found
Mar 25, 2014 4:46:30 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: The registered message body writers compatible with the MIME media type are:

处理后的Json是{"status":"Entity added successfully."}

我的观察:似乎我需要在某个地方为Json注册Gson实现,让容器知道我将使用Gson的JsonObject发送Json数据。如果我没有正确观察,那么我应该在哪里注册,如果我完全错了,请纠正我。

我的实现如下:

@POST
@Path("/entity")
@Produces(MediaType.APPLICATION_JSON)
public Response addEntity(@FormParam("entity") String jsonEntity, @FormParam("entityType") String jsonEntityType) {
    JsonObject jSonStatus = null;
    log.info("Entered webservice method: " + jsonEntity.toString() + "\n" + jsonEntityType.toString());
    if (jsonEntity != null && jsonEntityType != null) {
        dispatcher = dispatcher.getDispatcher();
        jSonStatus = dispatcher.addEntity(jsonEntity, jsonEntityType);
    }
    log.info("Returning from webservice method: " + jSonStatus);
    ResponseBuilder rb = new ResponseBuilderImpl();
    // rb.type(MediaType.APPLICATION_JSON);   tried with this also, but no luck
    rb.entity(jSonStatus);
    rb.status(Status.OK);

    return rb.build();
}

1 个答案:

答案 0 :(得分:1)

我想出了'MessageBodyReader'和'MessageBodyWriter'的用法,我发现实现这两个接口的需要只是将解析逻辑与核心业务逻辑分开。因为我已经为我实现了解析器,所以我不得不改变我的解析代码以利用接口。

所以,我决定返回String并设置response type as Json,因为我在处理后已经有了Json字符串。

所以现在我的代码看起来像:

    @Produces(MediaType.APPLICATION_JSON)
    public String addEntity(@FormParam("entity") String jsonEntity, @FormParam("entityType") String jsonEntityType) {
        JsonObject jSonStatus = null;
        ....
        ....    
        return JsonStatus.toString;
}

要检查Advance Rest client中的回复,它会显示正确的Json Content-Type: application/json

注意:如果我没有处理重要的事情,请发表评论。