我有一个 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 等
但我不确定如何在我的用例中避免它
经过一番调查,我发现除了使用
这些原本是我的测试
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