我现在有一个使用Jersey的RESTful api,并且正在将它转换为符合OData标准。有一些我尚未转换的东西,但会到达那里,而且此刻并不重要。我需要转换的一件事是重要的是关键路径参数。 Odata的标准是将密钥包裹在括号中。所以在这个例子中myapi.com/product(1) - 是OData调用来获取id为1的产品。目前在我的系统中可以使用myapi.com/product/1
当我在路径参数中添加括号时,出现404错误。我的类级别路径是@Path(“/ product”),我的方法级别路径是@Path(“({id})”),并且用作@Path(“/ {id}”)。我已经尝试添加括号作为变量规划的一部分,以便在方法中去除它们,并且我尝试使用一些正则表达式@Path(“{id:regex stuff}”)来格式化id,并且都不起作用。
如果我使用@Path“/({id})”这样的方法路径参数 - 所以调用是myapi.com/product/(1),它可以正常工作。括号显然不是问题。似乎Jersey使用转发斜杠将uri分成块,并且感觉id和root资源名称之间没有正斜杠,然后找不到任何东西。这说得通。
有没有办法改变Jerseys方法匹配uri字符串与一些正则表达式或东西?有人和Odata一起使用Jersey吗?我宁愿不使用odata4j来解决这个问题,似乎应该有办法让这个工作。
我做了什么: 根据Pavel Bucek的回答,我确实将ContainrRequestFilter独立地应用于我用于安全性的过滤器。在我的情况下,我没有看到是否存在,我只是试图做替换。
try
{
String uriString = request.getRequestUri().toString();
uriString = uriString.replaceAll("(\(|\)\/?)", "/");
request.setUris(request.getBaseUri(), new URI(uriString));
} catch (final Exception e)
{
}
return request;
答案 0 :(得分:1)
我认为如何处理这个“协议”的最简单方法是引入ContainerRequestFilter,它将在传入的URI中用“/ $”替换“()$”。因此,您将能够在一个应用程序中提供OData和标准REST请求。
我用来测试这种情况的简单过滤器:
rc.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, new ContainerRequestFilter() {
@Override
public ContainerRequest filter(ContainerRequest request) {
try {
if(request.getRequestUri().toString().endsWith("(1)")) {
request.setUris(
request.getBaseUri(),
new URI(request.getRequestUri().toString().replace("(1)", "/1")));
}
} catch (Exception e) {
}
return request;
}
});
两者
curl“http:// localhost:9998 / helloworld(1)”
卷曲“http:// localhost:9998 / helloworld / 1”
现在点击相同的资源方法。 (显然你需要改进当前的过滤器以便能够处理各种值,但它应该适合你)。