Java Jersey:有没有一种干净的方法来指定允许的URL扩展名?

Java Jersey:有没有一种干净的方法来指定允许的URL扩展名?,java,rest,jersey,jersey-1.0,Java,Rest,Jersey,Jersey 1.0,我使用的是Jersey 1.17.1,在我创建的每个URL上,我都希望允许人们将“.json”放在末尾。下面是我所做工作的一个例子: @GET @Path("basepath{extension: (\\.json)?}") public String foobar() { ... } 最终,我会让他们在无、“.json”或“.xml”之间做出选择,我担心我在这里干的违规行为。我必须将每个@Path改为: @GET @Path("basepath{extension: (\\.json

我使用的是Jersey 1.17.1,在我创建的每个URL上,我都希望允许人们将“.json”放在末尾。下面是我所做工作的一个例子:

@GET
@Path("basepath{extension: (\\.json)?}")
public String foobar() {
    ...
}
最终,我会让他们在无、“.json”或“.xml”之间做出选择,我担心我在这里干的违规行为。我必须将每个@Path改为:

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

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

一种方法是对Jersey子类化,并告知Jersey哪些扩展应该映射到哪些媒体类型。例如:

public类示例ResourceConfig扩展了PackageResourceConfig{
@凌驾
公共映射getMediaTypeMappings(){
Map Map=newhashmap();
map.put(“xml”,MediaType.APPLICATION\uxml\utype);
map.put(“json”,MediaType.APPLICATION\u json\u TYPE);
返回图;
}
}
然后,您的实际REST服务可能如下所示:

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

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

在REST API实现中,资源表示可以是xml或json等。如果将类型指定为URL的扩展,这不是restful实现的好方法。正确的方法是使用
HTTP接受头

比如
Accept:application/json
或者

Accept: application/xml

请参阅:

这很酷。如果我在那里抛出了另一个要求:我希望PDF有一个特殊的路径。这可以通过在
getMediaTypeMappings
中避免它,并在资源代码中将它显式设置为
@products
来实现吗?当然,这里有一些选项。我仍然会将PDF添加到您的媒体类型映射中。您可以使用与
@生成的
PDF相同的
@路径编写一个单独的方法。您可以将PDF添加到现有方法的
@products
,检测客户端是否请求PDF并相应修改响应。或者,如果您的响应bean对它有帮助,您可以实现一个
@生成
PDF的响应bean。然后,您只需将
@products
PDF添加到现有的foobar方法中,就完成了。此选项还处理不带URL扩展名的请求:Jersey将提供第一个
MediaType
注释,除非客户端添加
Accept
头,在这种情况下,Jersey将提供该媒体类型。通过这种方式,您可以遵守accept标头,并通过更改浏览器中的URL扩展名方便地更改返回类型。请注意,在Jersey 2.x中,您只需在web.xml中设置
init param
Jersey.config.server.mediaTypeMappings,对于包含name:value扩展对列表的值:
jersey.config.server.mediaTypeMappings txt:text/plain、xml:application/xml、json:application/json
@condit,我在应用程序中做了类似的事情,并且面临一个问题。当我以.xml作为扩展名进行GET调用时,我得到了预期的响应,而当我尝试使用.json时,它返回了一个带有200的空响应。有什么问题吗?我想如果你要学究气,你是对的。但在我看来,能够在浏览器中测试这一点的好处是完全值得的。事实上,请借此机会告诉我:如果我违反了这一点,会发生什么坏事?资源有其表示形式和唯一的URL。但是在这个场景中,相同的资源将由不同的URL表示。因此,从客户端的角度来看,它有2-3个不同的URL代表相同的资源,可能会造成混乱。假设你有3种格式的XML,JSON,HTML,所以你必须提供3个URL。至于表示格式,我们可以在HTTP头中提供,URL保持不变。