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

tro*_*ble 6 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) {

   }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器.java :

public class MyController implements MyInterface {

   @Override
   public String getMyParam(String name, String surname) { return name + surname; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

执行查询请求时 PathVariable 和 RequestAttribute 是否不可混合?

编辑 1

当我?surname=={surname}从@Get 值中删除 时,它会发生“HttpClientResponseException:需要参数 [String surname] 未指定”。

cgr*_*rim 9

surname在您的情况下不是请求属性而是查询值(参数)。所以使用@QueryValue注释而不是@RequestAttribute在 URL 模式中指定它。

所以控制器实现可以是这样的:

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

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

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