Jersey和Odata Key Path Param格式

时间:2012-02-21 17:37:51

标签: jersey odata

我现在有一个使用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;

1 个答案:

答案 0 :(得分:1)

我认为如何处理这个“协议”的最简单方法是引入ContainerRequestFilter,它将在传入的URI中用“/ $”替换“()$”。因此,您将能够在一个应用程序中提供OData和标准REST请求。

请参阅http://jersey.java.net/nonav/apidocs/1.11/jersey/com/sun/jersey/spi/container/ContainerRequestFilter.html

我用来测试这种情况的简单过滤器:

    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”
现在点击相同的资源方法。 (显然你需要改进当前的过滤器以便能够处理各种值,但它应该适合你)。