我有以下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);
有人发现我做错了吗?任何人都有任何关于找出球衣试图映射到哪个方法的提示?
感谢。
答案 0 :(得分:5)
使用上面定义的3种方法,你基本上有3种资源:
当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模板。