使用 Micronaut 获取多个请求参数@PathVariable 和@RequestAttribute?

Multiple get request parameters @PathVariable and @RequestAttribute with Micronaut?

我的控制器中有一个具有不同参数的 get 函数:

myinterface.java:

public interface MyInterface {

   @Get(value = "/bob/{name}/params?surname={surname}")
   String getMyParam (
   @Parameter(name="name", required=true)
   @PathVariable("name") String name, 
   @NotNull 
   @Parameter(name="surname", required=true) 
   @Valid 
   @RequestAttribute(value="surname") String surname) {

   }
}

mycontroller.java:

public class MyController implements MyInterface {

   @Override
   public String getMyParam(String name, String surname) { return name + surname; }
}

但是当我调用“http://localhost:8080/bob/marley/params?surname=lion”时,它发送了一条错误消息:找不到页面。

当我使用可选参数时 /books{?max,offset} 它工作正常。我错过了什么吗?

PathVariable 和 RequestAttribute 在做查询请求时不能混用吗?

编辑 1

当我从 @Get 值中删除 ?surname=={surname} 时,会出现 "HttpClientResponseException: Require argument [String surname] not specified".

surname 在你的例子中不是请求属性而是查询值(参数)。所以使用 @QueryValue 注释而不是 @RequestAttribute 并且不要在 URL 模式中指定它。

所以控制器实现可以如下所示:

@Controller
public class MyController {
    @Get(value = "/bob/{name}/params")
    String getMyParam(String name, @QueryValue String surname) {
        return name + surname;
    }
}

另一件事是 surname 参数的 @NotNull 注释是多余的。默认情况下需要该参数。如果您希望它是可选的,那么它必须是 Optional 类型,如下所示:

@Get(value = "/bob/{name}/params")
String getMyParam(String name, @QueryValue Optional<String> surname) {
    return name + surname.orElse("");
}