动态替换路径参数
Replace path parameter dynamically
我有一个@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 文档中没有关于此行为的信息,但在 very old Resteasy doc 中有一条信息,即 getPathParameters()
returns 一个不可修改的列表。如果它是不可修改的,那为什么我可以替换提供者中的值呢?
然而,该值不会被替换。如何用新值覆盖现有路径参数?
(当然,我可以将新的 userId 添加为某些 header 参数并稍后在端点中获取信息,但这不是一个好的解决方案)
我现在有办法了。
这有点麻烦,但它确实有效。首先,我必须添加一个额外的注释 @PreMatching
。这会导致提供程序在请求中更早地执行,因此您可以在路径被处理之前对其进行操作。缺点是我没法再用PathParameters
了,因为这个时候还没有设置占位符{userId}
。相反,我不得不以某种方式通过路径段从路径中提取信息:
List<PathSegment> pathSegments = requestContext.getUriInfo().getPathSegments();
不幸的是,我不得不从新重建整个路径(包括查询参数!)以更改 userId。
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());
我有一个@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 文档中没有关于此行为的信息,但在 very old Resteasy doc 中有一条信息,即 getPathParameters()
returns 一个不可修改的列表。如果它是不可修改的,那为什么我可以替换提供者中的值呢?
然而,该值不会被替换。如何用新值覆盖现有路径参数?
(当然,我可以将新的 userId 添加为某些 header 参数并稍后在端点中获取信息,但这不是一个好的解决方案)
我现在有办法了。
这有点麻烦,但它确实有效。首先,我必须添加一个额外的注释 @PreMatching
。这会导致提供程序在请求中更早地执行,因此您可以在路径被处理之前对其进行操作。缺点是我没法再用PathParameters
了,因为这个时候还没有设置占位符{userId}
。相反,我不得不以某种方式通过路径段从路径中提取信息:
List<PathSegment> pathSegments = requestContext.getUriInfo().getPathSegments();
不幸的是,我不得不从新重建整个路径(包括查询参数!)以更改 userId。
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());