我花了两天时间没有运气。我有一个使用泽西和杰克逊的项目。它可以很好地处理JSON请求,并尝试添加XML,在添加几个jar之后,它也可以使用XML。
问题在于,对于没有参数的请求(既不是JSON也不是XML),API正在检索XML而不是JSON(我们默认需要JSON)。
我的请求代码如下所示:
@POST
@Produces({"application/json", "application/xml"})
@Consumes({"application/json", "application/xml"})
public TokenResponse authenticateUser(Credentials credentials) {//code here}
在另一篇文章中看到这是一个在版本2.16中解决的Jetty错误,因此我决定在没有运气的情况下迁移到2.51.1。 JSON请求工作正常,但是当我发送xml帖子(使用邮递员)时,服务器返回"不支持的媒体类型"错误。
我也尝试使用版本球衣2.17,因为它使用的是与2.7相同的jackson库,结果与以前相同。
我没有使用maven,所以这里是我用于三种情况的库的副本:
1.- JSON和XML有效,但默认情况下始终返回XML: 2.- JSON有效,但XML请求返回不支持的媒体类型 3.- JSON有效但XML请求返回不支持的媒体类型
提前谢谢
最后,我决定使用我已经使用的版本而不是更新库,并将下面的解决方案添加到@Produces注释
答案 0 :(得分:0)
为answer中提到的每种媒体类型设置qs
因素应该有效。它可以取0
(不合需要的)和1
(非常需要)之间的值:
@Produces({ "application/json; qs=1", "application/xml; qs=.5" })
如果您不想更改每个@Produces
注释,则可以使用过滤器添加Accept: application/json
标头(如果它不存在)。
@Provider
@PreMatching
public class DefaultAcceptHeaderFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
MultivaluedMap<String, String> headers = requestContext.getHeaders();
if (!headers.containsKey(HttpHeaders.ACCEPT)) {
headers.putSingle(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
}
}
}
即使客户端未发送Accept
标头,它也会确保您的资源方法将生成JSON。