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

时间:2019-07-10 16:21:58

标签: 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:要求参数[String surname]未指定”。

1 个答案:

答案 0 :(得分:0)

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("");
}