3

我正在使用 Jersey 1.17.1,并且在我创建的每个 URL 上,我都希望允许人们将“.json”放在末尾或不放。这是我所做的一个例子:

@GET
@Path("basepath{extension: (\\.json)?}")
public String foobar() {
    ...
}

最终我会让他们在“.json”或“.xml”之间做出选择,我担心我在这里违反 DRY。我将不得不将每个 @Path 更改为此:

@GET
@Path("basepath{extension: (\\.json|\\.xml)?}")
public String foobar() {
    ...
}

有没有更好的方法可以让我的路径值更可重用?虽然我不能使用 Jersey 2.0,但我很想知道它是否可以解决这个问题。

4

2 回答 2

5

一种方法是继承PackagesResourceConfig并通知 Jersey 哪些扩展应该映射到哪些媒体类型。例如:

public class ExampleResourceConfig extends PackagesResourceConfig {
  @Override
  public Map<String, MediaType> getMediaTypeMappings() {
    Map<String, MediaType> map = new HashMap<>();
    map.put("xml", MediaType.APPLICATION_XML_TYPE);
    map.put("json", MediaType.APPLICATION_JSON_TYPE);
    return map;
  }
}

然后您的实际 REST 服务可能如下所示:

@GET
@Path("basepath")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response foobar() {
  ...   
}

Jersey 将根据 url 扩展名选择适当的媒体类型。请注意,Response返回的不是String. 我不确定您如何构建响应以及您的要求是什么,但 Jersey 可以毫无问题地处理将您的 Java bean 转换为 XML 或 JSON(甚至 JSONP)。

于 2013-09-17T23:59:39.007 回答
0

在 REST API 实现中,资源表示可以是 xml 或 json 等。如果您将类型指定为 URL 的扩展名,这不是一个很好的 restful 实现方式。正确的方法是使用HTTP ACCEPT header

喜欢Accept: application/json

Accept: application/xml

参考:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

于 2013-09-18T07:05:05.340 回答