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

时间:2011-10-12 12:19:07

标签: 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);

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

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

有人发现我做错了吗?任何人都有任何关于找出球衣试图映射到哪个方法的提示?

感谢。

1 个答案:

答案 0 :(得分:5)

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

  • / {溶液}
  • / {溶液} / {路径:[α-Z0-9 / \ - ] *}
  • {路径:[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模板。