我正在为 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/