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

标签 java rest annotations jax-rs jersey-2.0

我正在为 API 服务器使用最新版本的 Jersey。 我定义了下一个资源:

@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 调用此资源:

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

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

最佳答案

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

我不知道那是什么; header 未以 XML 格式发送,但假设您正确发送了 header ,下面是它的分解方式。

@Produces 处理 Accept header ,而 @Consumes 处理客户端 Content-Type header ,当客户端发送数据。那么让我们看看你的两个 @Produces 注释,针对 Accept header

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

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

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

所以他们都没有 text/html,所以把它划掉。它们都没有application/xhtml+xml,所以把它划掉。那只剩下 */*,意思是“随便发给我”。 所以 Jersey 可以自由选择哪一个。结果是不可预测的。您不能对此做出任何假设。那是客户的错。不是我们的。客户端应发送正确的 header 。或者我们应该更好地记录我们的 API,这样客户就知道我们可以生产什么类型 :-)

关于java - Jersey/Jax-RS 如何在资源中选择正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37037270/

相关文章:

java - GraphQL + Java - 如何过滤子字段?

java - 选择性 API Javadoc

groovy - 如果注释包含闭包字段,则使用注释字段实现特征的类会丢失特征字段上的注释

Java(初学者): Displaying the first name alphabetically and last name alphabetically after being given a list of names from the user

java - Android Sqlite 表未创建

java - 如何在不打开的情况下保存 itextpdf 生成的 pdf 文件?

rest - 在不同的 Docker 容器中运行的 Spring Boot 应用程序拒绝连接

java - 在JEE(JBoss)环境中的neo4j:

java - 带有 couchbase 的 rxjava 是否为非批量操作提供值(value)

java - 使用一个不完全是 JSON 的主体