Jersey / Jackson不支持的媒体类型(用于XML请求)

时间:2017-09-07 12:04:46

标签: json xml rest jackson jersey

我花了两天时间没有运气。我有一个使用泽西和杰克逊的项目。它可以很好地处理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,所以这里是我用于三种情况的库的副本:

enter image description here

1.- JSON和XML有效,但默认情况下始终返回XML: 2.- JSON有效,但XML请求返回不支持的媒体类型 3.- JSON有效但XML请求返回不支持的媒体类型

提前谢谢

最后,我决定使用我已经使用的版本而不是更新库,并将下面的解决方案添加到@Produces注释

How to set to default to json instead of xml in jersey?

1 个答案:

答案 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。