Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 动态替换路径参数_Jakarta Ee_Jax Ws_Resteasy - Fatal编程技术网

Jakarta ee 动态替换路径参数

Jakarta ee 动态替换路径参数,jakarta-ee,jax-ws,resteasy,Jakarta Ee,Jax Ws,Resteasy,我有一个@Provider,它应该替换如下路径变量: @Provider @Priority(value = 1) public class SecurityCheckRequestFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) throws IOException { //CODE

我有一个@Provider,它应该替换如下路径变量:

@Provider
@Priority(value = 1)
public class SecurityCheckRequestFilter implements ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException
    {
        //CODE

        requestContext.getUriInfo().getPathParameters().putSingle("userId", someNewUserId);
    }
}
当我调试它时,路径变量userId似乎被替换,但是在工作流中稍后的端点处,例如/user/{userId},旧值再次出现。没有任何东西被替换。在最新的RestEasy文档中没有关于此行为的信息,但在中有一条信息,即getPathParameters返回一个不可修改的列表。如果它是不可修改的,那么为什么我可以替换提供程序中的值呢? 然而,该值并没有被替换。如何用新值覆盖现有路径参数

当然,我可以添加新的userId作为一些头参数,然后在端点中获取信息,但这不是一个好的解决方案,我现在有了一个解决方案。 虽然有点笨重,但它可以工作。首先,我必须添加一个额外的注释@prematch。这会导致在请求中更早地执行提供程序,因此您可以在处理路径之前对其进行操作。缺点是我不能再使用PathParameters了,因为此时未设置占位符{userId}。相反,我必须以某种方式从路径中逐段提取信息:

List pathSegments=requestContext.getUriInfo.getPathSegments

不幸的是,我不得不从新路径重建整个路径,包括查询参数!更改用户ID

String fullPath = requestContext.getUriInfo().getPath();
MultivaluedMap<String, String> queryParameters = requestContext.getUriInfo().getQueryParameters(true);

String modifiedPath = fullPath.replaceFirst(obfuscationId, userId); 

UriBuilder uriBuilder = UriBuilder.fromPath(modifiedPath);
queryParameters.forEach((k,v) -> { uriBuilder.queryParam(k, v.get(0)); } );
requestContext.setRequestUri(uriBuilder.build());
当前的JavaDoc for表示相同的事情FWIW