0

我正在使用 JAX-RS 创建一个 Web 服务。我知道您可以使用 JAXB 注释对域模型进行注释,然后向后倾斜并观察整个类被转换为 XML/JSON。但是,这并不适合我的应用程序中的所有场景。将类编组为 XML 并不总是合适的。有时我只需要一些字段等,而且我还希望能够动态添加未在域模型中表示的自定义元素。

你会怎么做?我需要为此使用其他框架吗?我刚找到GSON,值得一看吗?我的资源的 XML 表示并不那么重要。如果我使用 GSON,Web 服务应该响应什么?你只是使用 String 作为返回类型吗?

伪代码,还没看GSON。

@Produce("application/json")
public String someMethod() {
   return gson.toJSON();
}
4

2 回答 2

2

在您具有多变响应类型的情况下,通常最好使用 javax.ws.rs.core.Response 作为返回。这使您可以在运行时完全控制确定将被包装和返回的实际实体。

然后,您可以在调用资源方法时决定返回核心业务对象、业务对象的包装器或自定义序列化版本(作为字符串)。粗略的伪代码:

@Produce("application/json")
public Response someMethod() {

    switch(mySpecialCase) {
        case 1:
            return Response.ok(coreEntity).build(); break;
        case 2:
            return Response.ok(new LiteEntity(coreEntity)).build(); break;
        case 3:
            return Response.ok(Util.toGSON(coreEntity).toString()).build(); break;
    }
}

这种方法的一个优点是服务器端拦截器仍然会触发并在您的实体对象上执行转换,因此您仍然可以利用动态序列化到 JSON 和 XML,但同时您可以规避转换,通过使用 String 作为实体类型。

于 2012-11-17T15:46:30.577 回答
1

您不应该返回字符串,而是返回类型。
例如:

@Produces(MediaType.APPLICATION_JSON)
public Person String getPerson() {
  return personDao.getPerson();
}

请在以下位置添加依赖项(例如通过 maven):
jersey-json jar
您还应该更改您的 web.xml,以在 Jersey 开始支持 JSon,通过以下方式:

<init-param>
  <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
  <param-value>true</param-value>
</init-param>

请记住,我的解决方案不需要对 Person 类执行特殊注释。

于 2012-11-17T15:46:51.093 回答