在@Path中使用带有jersey

时间:2017-06-26 12:45:30

标签: java spring-boot jersey-2.0

我正在尝试提供可以收听多个版本的端点,即/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/testGET /v2/test工作正常,POST /v1/test但不行。

我得到405 Method Not Allowed例外。 据我所知,当MethodSelectingRouter识别路径时会抛出异常,但找不到具有相应HTTP动词的方法。 问题似乎是它选择了最具体的路径(在我的情况下为/v1/test),因为它不知道POST动词。

有人知道如何避免这个问题吗? 干杯

PS :我在版本spring-boot-starter-web

中使用带有针织物(即spring-boot-starter-jersey1.5.2.RELEASE)的春季靴子

0 个答案:

没有答案