java – Jersey / Jax-RS如何在资源中选择正确的方法

我正在使用最新版本的Jersey作为API服务器.

我定义了下一个资源:

@javax.ws.rs.Path("/myPath")
public class MyResource {

  @GET
  @Consumes({MediaType.WILDCARD, MediaType.TEXT_PLAIN, MediaType.TEXT_HTML})
  @Produces(MediaType.TEXT_PLAIN)
  public Response method1(@Context Request request) {
  }

  @GET
  @Consumes(MediaType.APPLICATION_JSON)
  @Produces(MediaType.APPLICATION_JSON)
  public MyObject method2() {}

}

现在让我说我用下一个标题调用此资源:

<header>
    <name>Accept</name>
    <value>text/html, application/xhtml+xml, */*</value>
</header>

在没有方法生产者注释匹配的情况下,Jersey如何知道要匹配哪一个?
我问,因为有一次服务器响应方法2并在重新启动它之后,它响应了method1.

最佳答案

<header>
    <name>Accept</name>
    <value>text/html, application/xhtml+xml, */*</value>
</header>

我不知道那是什么;标题不是以XML格式发送的,但假设您正确发送了标题,那么它就是如何分解的.

@Produces处理Accept标头,@ Consons在客户端发送数据时处理客户端Content-Type标头.那么让我们看看你的两个@Produces注释,对着Accept标头

@Produces(MediaType.TEXT_PLAIN)
public Response method1() {}

@Produces(MediaType.APPLICATION_JSON)
public MyObject method2() {}

text/html, application/xhtml+xml, */*

所以他们都没有text / html,所以把它交叉出来.他们都没有application / xhtml xml,所以把它交叉出来.那只留下* / *,这意味着“送我任何东西”.所以泽西岛可以自由选择哪一个.结果是不可预测的.你无法做出任何假设.那是客户的错.不是我们的.客户端应该发送正确的标头.或者我们应该更好地记录我们的API,因此客户知道我们可以生产什么类型:-)

点赞