在客户端使用@Path 注释中的查询参数

问题描述

我正在使用 Quarkus (2.0.2.Final)
这是我的服务器端端点

class Endpoint {
    @Path("{userId}/password")
    @Consumes(MediaType.APPLICATION_JSON)
    @PUT
    @Transactional
    public void changePassword(@QueryParam("action") String act,@PathParam("userId") long userId,AbstractPasswordResourceBean action) {...}
}

@QueryParam "action" 可以是 "reset","reset-request","change" 之一,正文内容会因动作而异。

在客户端,我的想法是使用 3 种不同的方法重新映射此端点,一种用于任何操作:

@RegisterRestClient
@Path("/users")
class ClientSide {
    @Path("{userId}/password?action=change")
    @PUT
    TokenResponse changePassword(@PathParam("userId") long userId,ChangePasswordBean request);

    @Path("{userId}/password?action=reset")
    @PUT
    TokenResponse resetPassword(@PathParam("userId") long userId,ResetPasswordBean request);

    @Path("{userId}/password?action=reset-request")
    @PUT
    TokenResponse requestResetPassword(@PathParam("userId") long userId,ResetPasswordRequestBean request);
}

对上述方法之一的每次调用都以 404 解析,因为调用的 url 解析为 http://service:port/service-name/users/{userId}/password%3Faction=...错误似乎是由查询字符串编码引起的。

这是错误还是设计行为?还是我遗漏了什么?

预先感谢您的帮助。

解决方法

@Path 批注不是为了接受查询字符串而设计的。因此,为什么它会转义为可接受的路径(同意这不是您想要的,但这就是它的工作方式)。

鉴于 JAX-RS 路径匹配的工作原理,我认为您无法做您想做的事。