Jakarta ee 动态替换路径参数
我有一个@Provider,它应该替换如下路径变量: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
@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