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