在REST服务中编码响应

时间:2017-09-28 10:45:03

标签: java json rest jackson jax-rs

我在服务方法中使用了类javax.ws.rs.core.Response

@GET
@Path("/object/{id}")    
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response findObject(@Context HttpHeaders headers,
                                 @PathParam("id") String objectId) {
    Object object = getObject(objectId);
    return createResponse(object, headers);
}

private Response createResponse(Object object, HttpHeaders headers) {
    Response.ResponseBuilder responseBuilder = Response
            .ok()
            .entity(object)
            .type(MediaType.APPLICATION_JSON_TYPE)
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
            .build();
}

我的系统的Response内容层次结构的实例,它包含在实例object中。这是所有孩子及其属性的对象。我希望在object中编码属性的值。例如,我需要在名称中给出百分比编码符号而不是空格。我需要编码整个我的响应,包括所有字段。根据UTF-8编码。例如,我的回复中需要'His name: John',而不是某个字段'His20%name%3A20%John'的值。对于整个层次结构中的所有字段都是如此。

我没有找到比使用URLEncoder.encode(String s, String enc)方法手动处理每个字段更好的方法:

fieldValue = URLEncoder.encode(fieldValue, "UTF-8");

但在这种情况下,我需要手动浏览我的层次结构的所有对象中的所有字段作为响应。也许有更标准和更正确的方法来做到这一点?

有些字段不是字符串,例如类型为BigDecimal。它们可以包含分隔符。我该如何处理它们?在返回之前有没有办法对整个对象响应进行编码?

1 个答案:

答案 0 :(得分:0)

您可以为编码属性创建单独的字段/ getter。这样,原始值将保持不变。您还可以依靠反射来获取所有字段,并执行比这更麻烦的字段。

@Override
public void onResume() {
    super.onResume();
    if (adapter != null) {
        adapter = new PagerAdapter(frags);
        mViewPager.setAdapter(adapter);
        mViewPager.setCurrentItem(currentTabPosition);
    }
}