ton*_*edz 46
您不能@Path在单个方法上使用mutliple 注释.它会导致"重复注释"语法错误.
但是,有许多方法可以有效地将两个路径映射到方法.
@PathJAX-RS中的注释接受参数,其值可以使用正则表达式进行限制.
这个注释:
@Path("a/{parameter: path1|path2}")
将允许通过两者/a/path1和两者的请求达到该方法/a/path2.如果需要使用子路径,请使用转义斜杠:{a:path1\\/subPath1|path2\\/subPath2}
或者,您可以设置重定向.这是通过定义另一个子资源在Jersey(JAX-RS的参考实现)中实现它的方法.这只是一个例子,如果您喜欢不同的处理重定向的方式,请随意使用它.
@Path("basepath")
public class YourBaseResource {
//this gets injected after the class is instantiated by Jersey
@Context
UriInfo uriInfo;
@Path("a/b")
@GET
public Responce method1(){
return Response.ok("blah blah").build();
}
@Path("a/b/c")
@GET
public Response method2(){
UriBuilder addressBuilder = uriInfo.getBaseUriBuilder();
addressBuilder.path("a/b");
return Response.seeOther(addressBuilder.build()).build();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您经常需要这样的功能,我建议使用servlet过滤器拦截传入的请求并动态重写路径.这应该可以帮助您将所有重定向保留在一个位置.理想情况下,您可以使用现成的库.UrlRewriteFilter可以做到这一点,只要您使用BSD许可证(请查看他们的谷歌代码网站了解详情)
另一种选择是通过在Java应用程序前设置代理来处理此问题.您可以设置Apache服务器以提供基本的缓存和重写规则,而不会使Java代码复杂化.
yeg*_*niy 16
正如Tom的回答所解释的那样,您不能@Path在单个方法上使用多个注释,因为您将error: duplicate annotation在编译时遇到.
我认为解决这个问题的最简单方法是使用方法重载:
@Path("{foo}")
public Response rest(@PathParam("foo") final String foo) {
return this.rest(foo, "");
}
@Path("{foo}/{bar}")
public Response rest(@PathParam("foo") final String foo,
@PathParam("bar") final String bar) {
return Response.ok(foo + " " + bar).build();
}
Run Code Online (Sandbox Code Playgroud)
如果遇到多个重载方法都有签名的情况,也可以使用更多不同的方法名称.
您的特定示例的另一种解决方案
我们假设:
/a 是资源类/b/c并且/b是方法的路径因为完整路径看起来像:
<protocol><host><port><app><url-pattern><resource-path><method-path>.
使用可选参数
@Path("/b{c : (/c)?}")
public Response searchNames(@PathParam("c") String val) {
...
}
Run Code Online (Sandbox Code Playgroud)
以上示例适用于所有示例,例如:
/b/b//b/c/b/c/但是当c提供时,val是/c(它有一个/之前).
如果你想解决上面的问题(避免Java解析),你需要更复杂的东西:
@Path("/b{slash : (/)?}{c:((?<=/).*)?}")
Run Code Online (Sandbox Code Playgroud)
这将只返回c(不/c)为3 次子弹点,但对于4 个圆点将返回c/其在Java来进行解析.
但对于您的情况("执行的方法是相同的"),不要担心解析,因为您没有不同的操作.
| 归档时间: |
|
| 查看次数: |
46600 次 |
| 最近记录: |