动态替换路径参数

时间:2017-08-20 16:11:56

标签: java-ee jax-ws resteasy

我有一个@Provider应该替换这样的路径变量:

/user/{userId}

当我调试它时,路径变量“userId”似乎被替换,但在工作流后面的端点(例如getPathParameters()),旧值再次出现。什么都没有被取代。在最新的RestEasy文档中没有关于此行为的信息,但在very old Resteasy doc中,有一条信息,<!DOCTYPE html> <html> <head> <script src="http://knockoutjs.com/downloads/knockout-3.0.0.debug.js" type="text/javascript"></script> </head> <body> <p> message: <span data-bind="text: message"></span> </p> <p> messageChanged: <span data-bind="text: messageChanged"></span> </p> </body> <script> var viewModel = { message: ko.observable('Hello'), messageChanged: ko.observable(0) }; var dispose = viewModel.message.subscribe(function _subscribe(newValue) { viewModel.messageChanged(viewModel.messageChanged() + 1); }); ko.applyBindings(viewModel); viewModel.message('How are you?'); viewModel.message('Good-bye'); </script> </html> 返回不可修改的列表。如果它是不可修改的,为什么我可以替换提供程序中的值呢? 然而,价值没有被取代。如何使用新值覆盖现有路径参数?

(当然,我可以将新的userId添加为一些标头参数,稍后在端点中获取信息,但这不是一个好的解决方案)

1 个答案:

答案 0 :(得分:0)

我现在有一个解决方案。 它有点麻烦,但它的工作原理。首先,我必须添加一个额外的注释@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());