Java 基于Accept标头仲裁Jersey端点:当没有给出Accept标头时该怎么办?

Java 基于Accept标头仲裁Jersey端点:当没有给出Accept标头时该怎么办?,java,annotations,jersey,dropwizard,http-accept-header,Java,Annotations,Jersey,Dropwizard,Http Accept Header,假设我有两个端点,如下所示: @GET @Path("/blah") @Produces(MIME_TYPE_1) public Thing getThing() { .... } @GET @Path("/blah") @Produces(MIME_TYPE_2) public OtherThing getOtherThing() { .... } 这对于根据客户机发送的Accept头仲裁调用哪个方法非常有效 我遇到的问题是,如果客户端完全错过了Accept头,我(出于某种

假设我有两个端点,如下所示:

@GET
@Path("/blah")
@Produces(MIME_TYPE_1)
public Thing getThing() {
    ....
}

@GET
@Path("/blah")
@Produces(MIME_TYPE_2)
public OtherThing getOtherThing() {
    ....
}
这对于根据客户机发送的
Accept
头仲裁调用哪个方法非常有效

我遇到的问题是,如果客户端完全错过了
Accept
头,我(出于某种原因)会调用第二个方法,我希望它是第一个方法

还有一个额外的复杂问题,就是它会自动输入到Swagger文档中,我不希望文档中出现额外的MIME类型,因此我不希望(例如)将
*/*
添加到第一个方法接受的类型中


(这是使用Dropwizard和Jersey 1.x,尽管我仍然有兴趣听到基于Jersey 2.x的解决方案,不久我们可能会升级到该解决方案。)

尝试使用
@注释中的quality factor参数:

@GET
@Path("/blah")
@Produces("application/json; q=0.6")
public Thing getThing() {
....
}

@GET
@Path("/blah")
@Produces("application/xml; q=1")
public OtherThing getOtherThing() {
....
}
如果客户端没有在请求中发送“Accept:”头,web服务器将执行
getOtherThing()
,因为它的质量因数高于
getThing()

免责声明:这适用于RestEasy,但我不能保证它适用于Jersey

品质因数参数是

您可以在RestEasy中找到有关此功能的更多信息

您可以在Jersey查询请求之前过滤请求并修改
Accept
标题。我不认为它能与
ContainerRequestFilter
一起工作,但它可能与
ServletFilter
一起工作。非常感谢这个解决方案,它也能与Apache CXF一起工作!