Jersey获得HTTP 405,未按预期处理路径映射

Ted*_*pin 1 java jersey

我有以下2种方法...

@GET
@Path("/{solution}")
public Response test(@PathParam("solution") String solution,
        @Context UriInfo uriInfo, @Context HttpHeaders headers);

@GET
@Path("/{solution}/{path:[a-z0-9/\\-]*}")
public Response testTest(@PathParam("solution") String solution,
        @PathParam("path") String nodePath,
        @Context UriInfo uriInfo, @Context HttpHeaders headers);
Run Code Online (Sandbox Code Playgroud)

当我调用/ my-app / test / test时,第二个方法被调用并且参数设置正确。当我调用/ my-app / test而不是第一个方法被调用时,我收到未找到的HTTP 405方法。我假设它正在将URL映射到其他方法之一,例如。

@DELETE
@Path("{path: [a-z0-9/\\-]*}")
public Response deleteTest(@PathParam("path") String path, @Context HttpHeaders headers);
Run Code Online (Sandbox Code Playgroud)

有人发现我做错了吗?任何人都可以找到jersey试图映射到的方法的任何提示?

谢谢。

Mar*_*ula 5

使用上面定义的3种方法,您基本上有3种资源:

  • /{解}
  • / {解决方案} / {路径:[a-z0-9 / \-] *}
  • {path:[a-z0-9 / \-] *}

当Jersey将请求与资源方法匹配时,它首先确定应将其映射到哪个资源(即URI模式)。第三个是与请求URL匹配的最具体的一个,因此一个被匹配。只有那时Jersey才会查看是否为该资源处理了相应的HTTP方法。这符合JAX-RS规范-您可以在此处的规范中查看匹配算法的详细说明:http : //jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3- 360003.7.2

因此,您应该考虑逻辑资源,让URI模板与它们匹配,然后为这些资源实现相应的HTTP方法。也就是说,如果“ / {solution}”和“ / {solution} / {path:[a-z0-9 / \-] *}”在逻辑上是两个不同的资源,并且都应支持@DELETE,则应定义两个删除操作,一个使用第一个模板,另一个使用第二个URI模板。