我正在尝试提供可以收听多个版本的端点,即/v1/test
和/v2/test
。为了不复制我的代码,我使用了jersey在@Path
注释中使用模式的能力。
我们假设我想提供GET和POST端点:
@Controller
@Slf4j
@Path("/")
public class TestController {
@GET
@Path("/v{version:[12]}/test")
@Produces(MediaType.APPLICATION_JSON)
public String test1(@PathParam("version") String version) {
System.out.println(String.format("GET /v%s/test called", version));
return "{\"foo\":\"bar\"}";
}
@POST
@Path("/v{version:[12]}/test")
@Produces(MediaType.APPLICATION_JSON)
public String test2(@PathParam("version") String version) {
System.out.println(String.format("POST /v%s/test called", version));
return "{\"foo\":\"bar\"}";
}
}
工作正常。
但是,如果我尝试使用GET端点的特定路径并使用POST端点的模式,则会遇到麻烦。 这里的控制器不起作用:
@Controller
@Slf4j
@Path("/")
public class TestController {
@GET
@Path("/v1/test")
@Produces(MediaType.APPLICATION_JSON)
public String test1() {
System.out.println("GET /v1/test called");
return "{\"foo\":\"bar1\"}";
}
@GET
@Path("/v2/test")
@Produces(MediaType.APPLICATION_JSON)
public String test2() {
System.out.println("GET /v2/test called");
return "{\"foo\":\"bar2\"}";
}
@POST
@Path("/v{version:[12]}/test")
@Produces(MediaType.APPLICATION_JSON)
public String test3(@PathParam("version") String version) {
System.out.println(String.format("POST /v%s/test called", version));
return "{\"foo\":\"barPOST\"}";
}
}
执行GET /v1/test
或GET /v2/test
工作正常,POST /v1/test
但不行。
我得到405 Method Not Allowed
例外。
据我所知,当MethodSelectingRouter
识别路径时会抛出异常,但找不到具有相应HTTP动词的方法。
问题似乎是它选择了最具体的路径(在我的情况下为/v1/test
),因为它不知道POST
动词。
有人知道如何避免这个问题吗? 干杯
PS :我在版本spring-boot-starter-web
spring-boot-starter-jersey
和1.5.2.RELEASE
)的春季靴子