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

Dan*_*lan 3 java rest jersey jersey-1.0

我正在使用Jersey 1.17.1并且在我创建的每个URL上我想让人们在最后放置".json".这是我所做的一个例子:

@GET
@Path("basepath{extension: (\\.json)?}")
public String foobar() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

最终我会让他们在没有任何选择,".json"或".xml"之间做出选择,我在这里担心我的DRY违规行为.我将不得不将每个@Path改为:

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

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

con*_*dit 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

@GET
@Path("basepath")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response foobar() {
  ...   
}
Run Code Online (Sandbox Code Playgroud)

泽西岛将根据网址扩展选择合适的媒体类型.请注意,Response返回而不是String.我不确定你是如何构建你的响应以及你的要求是什么,但Jersey可以处理将Java bean转换为XML或JSON(甚至是JSONP)而没有问题.