在 Spring 中处理 @GetMapping("") 的可选参数

问题描述 投票:0回答:1

我有一个 Spring Boot 应用程序,在类级别使用 @RequestMapping,在方法级别使用 @GetMapping。这是我的控制器的高度简化版本:

@RestController
@RequestMapping("/hello")
class HelloController {

    @GetMapping("")
    fun test(@RequestParam("name", required = false) name: String?): String {
        return "hello " + (name ?: "world")
    }
}

当我在没有

/hello
的情况下调用
name
时,它工作正常并返回“hello world”。

但是,当我调用

/hello?name=banana
时,它没有按预期工作,给我以下错误:

没有静态资源你好。

我尝试使用

@GetMapping("/")
而不是
@GetMapping("")
,但这不允许我在不添加可选参数的情况下调用
/hello
(即与 ?name=batman
 一起使用)。有没有办法在 Spring Boot 中正确处理这两种情况(带请求参数和不带请求参数)?

附加信息: 这是一次“回归失败”,从 Java 从 17 升级到 21,以及 Spring Boot 从 2.7.5 升级到 3.2.5。在这次升级之前,这曾经是有效的。 我注意到 Spring Boot 说明指出了

@RequestMapping 不能与在同一元素(类、接口或方法)上声明的其他 @RequestMapping 注解结合使用。如果在同一元素上检测到多个 @RequestMapping 注释,则会记录警告,并且仅使用第一个映射。这也适用于组合的 @RequestMapping 注释,例如 @GetMapping、@PostMapping 等

但我不确定如何在我的用例中避免它

经过一番调查,我发现除了使用
spring spring-boot kotlin get-mapping
1个回答
0
投票
和空端点进行测试之外,其他地方不存在该问题。

这些原本是我的测试

RestAssured.given().basePath("myapi/hello").`when`().get("") //<- succeeded RestAssured.given().basePath("myapi/hello").`when`().get("?name=banana") //<- failed

更改测试后这是结果
RestAssured.given().basePath("myapi").`when`().get("/hello") //<- succeeded
RestAssured.given().basePath("myapi").`when`().get("/hello?name=banana") //<- succeeded


© www.soinside.com 2019 - 2024. All rights reserved.