首页 > 解决方案 > 多个获取请求参数@PathVariable 和@RequestAttribute 与Micronaut?

问题描述

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

我的接口.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

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

标签: micronaut

解决方案


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

所以控制器实现看起来像这样:

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

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

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

推荐阅读