泽西岛:是否有一种干净的方式来指定允许的URL扩展?

时间:2013-09-17 22:41:57

标签: java rest jersey jersey-1.0

我正在使用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,但我有兴趣知道它是否可以解决这个问题。

2 个答案:

答案 0 :(得分: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将根据网址扩展名选择合适的媒体类型。请注意,系统会返回Response而不是String。我不确定你是如何构建你的响应以及你的要求是什么,但Jersey可以处理将你的Java bean转换成XML或JSON(甚至是JSONP)而没有问题。

答案 1 :(得分:0)

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

喜欢Accept: application/json

Accept: application/xml

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