Jersey预匹配筛选器:向修改的URI添加参数

Jersey预匹配筛选器:向修改的URI添加参数,jersey,jersey-2.0,jersey-1.0,Jersey,Jersey 2.0,Jersey 1.0,我有一个RESTAPI。例如: http://localhost:8080/api/user/view?name=user&lastname=demo 我想修改我的URI以维护版本。 我想在“/user/view”之间添加“/v1/” 因此,我的URI如下所示: http://localhost:8080/api/user/v1/view?name=user&lastname=demo 我可以修改我的URI并创建一个新的URI,但我不知道如何将参数传递给修改后的URI 以下是

我有一个RESTAPI。例如:

http://localhost:8080/api/user/view?name=user&lastname=demo
我想修改我的URI以维护版本。 我想在“/user/view”之间添加“/v1/” 因此,我的URI如下所示:

http://localhost:8080/api/user/v1/view?name=user&lastname=demo
我可以修改我的URI并创建一个新的URI,但我不知道如何将参数传递给修改后的URI

以下是我的代码:

@Provider
@PreMatching
public class RewriteUrl implements ContainerRequestFilter {

 @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        UriInfo uriInfo = requestContext.getUriInfo();

        String path = uriInfo.getPath();

        MultivaluedMap<String, String> parameters = uriInfo.getQueryParameters();

        path=path.replaceFirst("/","/v1/");   

        URI baseUri = uriInfo.getBaseUriBuilder().path(path).build();

        URI requestUri = uriInfo.getRequestUri();

        requestContext.setRequestUri(URI.create(baseUri.toString()));



     }

}
但是我不理解如何将参数传递给新的URI

我也想知道这样做是正确和安全的吗?
还是我做错了。

请让我知道他们的方法是否更好(在URI中添加'v1')

调试时,我发现了以下问题:

预匹配过滤器

uriInfo.getRequestUri().toString()   http://localhost:8080/api/user/view?name=user&lastname=demo

uriInfo.getAbsolutePath().toString()  http://localhost:8080/api/user/view

uriInfo.getBaseUri().toString()  http://localhost:8080/api/

uriInfo.getPath().toString() user/view

parameters.toString() {lastname=[demo], name=[user]}
uriInfo.getRequestUri().toString()   http://localhost:8080/api/user/v1/view

uriInfo.getAbsolutePath().toString()  http://localhost:8080/api/user/v1/view

uriInfo.getBaseUri().toString()  http://localhost:8080/api/

uriInfo.getPath().toString() user/v1/view

parameters.toString() {}
后过滤器

uriInfo.getRequestUri().toString()   http://localhost:8080/api/user/view?name=user&lastname=demo

uriInfo.getAbsolutePath().toString()  http://localhost:8080/api/user/view

uriInfo.getBaseUri().toString()  http://localhost:8080/api/

uriInfo.getPath().toString() user/view

parameters.toString() {lastname=[demo], name=[user]}
uriInfo.getRequestUri().toString()   http://localhost:8080/api/user/v1/view

uriInfo.getAbsolutePath().toString()  http://localhost:8080/api/user/v1/view

uriInfo.getBaseUri().toString()  http://localhost:8080/api/

uriInfo.getPath().toString() user/v1/view

parameters.toString() {}

不确定是否仍然相关,我最近也不得不实施这个。 以下是我的解决方案:

@Provider
@PreMatching
public class RewriteUrl implements ContainerRequestFilter {
 @Override
    public void filter(ContainerRequestContext requestContext) throws 
    IOException {
        UriInfo uriInfo = requestContext.getUriInfo();

        String path = uriInfo.getPath();

        path = path.replaceFirst("/","/v1/");   

        UriBuilder uriBuilder = UriBuilder
                     .fromUri(uriInfo.getBaseUri())
                     .path(path)
                     .replaceQuery(uriInfo.getRequestUri().getQuery());

        requestContext.setRequestUri(uriBuilder.build());
    }
}

我认为您不需要再次添加查询参数。您是否为它们签入了资源方法?或者您正在尝试添加新的URI?是的,我在post筛选器中调试并检查了我的新URI,并且得到了没有参数的新URI。为什么要检查URI。检查查询参数映射。这就是问题所在先生,我已经编辑了我的问题,并添加了我在过滤器中得到的参数。您是否尝试调用
path(path)。queryParam(…,…)