Jersey和Odata密钥路径参数格式

Jersey和Odata密钥路径参数格式,jersey,odata,Jersey,Odata,我现在有一个使用Jersey的RESTful api,并且正在将其转换为符合OData标准的api。有一些东西我还没有转化,但会实现,在这个时候并不重要。我需要转换的重要内容之一是关键路径参数。Odata的标准是将密钥包装在括号中。因此,在本例中,myapi.com/product(1)是用于获取id为1的产品的OData调用。目前,使用myapi.com/product/1在我的系统中,这是可能的 当我将括号添加到path参数时,我得到一个404错误。我的类级路径是@path(“/produc

我现在有一个使用Jersey的RESTful api,并且正在将其转换为符合OData标准的api。有一些东西我还没有转化,但会实现,在这个时候并不重要。我需要转换的重要内容之一是关键路径参数。Odata的标准是将密钥包装在括号中。因此,在本例中,myapi.com/product(1)是用于获取id为1的产品的OData调用。目前,使用myapi.com/product/1在我的系统中,这是可能的

当我将括号添加到path参数时,我得到一个404错误。我的类级路径是@path(“/product”),我的方法级路径是@path(“({id})”),并用作@path(“/{id}”)。我尝试过添加括号作为变量计划的一部分,以便在方法中去掉它们,我尝试过用一些regex@Path(“{id:regex stuff}”)格式化id,但这两种方法都不起作用

如果我将我的方法路径参数设置为@path”/({id})-,那么调用是myapi.com/product/(1),它可以正常工作。括号显然不是问题所在。Jersey似乎使用正斜杠将uri拆分为块,并检测到id和根资源名称之间没有正斜杠,然后什么也找不到。这是有道理的

有没有办法改变Jersey将uri字符串与一些正则表达式或其他东西匹配的方法?有人把球衣和小田一起用过吗?我不想仅仅为了解决这个问题而使用odata4j,似乎应该有办法让它发挥作用

我所做的: 根据Pavel Bucek的回答,我确实实现了一个独立于我用于安全的过滤器的ContainerRequestFilter。在我的情况下,我没有看是否存在,我只是试着做替换

    try
{
    String uriString = request.getRequestUri().toString();
    uriString = uriString.replaceAll("(\(|\)\/?)", "/");
    request.setUris(request.getBaseUri(), new URI(uriString));
} catch (final Exception e)
{
}
return request;

我认为处理这个“协议”的最简单方法是引入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;
        }
    });
两者都
卷曲“http://localhost:9998/helloworld(1) “
卷曲“http://localhost:9998/helloworld/1“

现在点击相同的资源方法。(显然,您需要改进当前过滤器,以便能够处理各种值,但它应该适合您)。

我们已经有了一个过滤器,因此我将考虑将其添加到其中,并尝试一下,谢谢。我没有考虑到这一点,因为我认为Jersey在点击过滤器之前确定了路径——资源。