我有一个@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添加为一些标头参数,稍后在端点中获取信息,但这不是一个好的解决方案)
答案 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());