【问题标题】:MessageBodyWriter not found for media type=application/json for DTO with @xmlrootelementMessageBodyWriter not found for media type=application/json for DTO with @xmlrootelement
【发布时间】:2017-04-21 00:34:27
【问题描述】:

我试图了解在什么情况下(如果可能)会出现这种类型的异常:

没有找到用于 DTO 的媒体类型 = 应用程序/json 的 MessageBodyWriter 使用@xmlrootelement

是的,我的 maven 依赖项是正确的,我什至有两个类似的 DTO,它们可以正常工作,让 Jersey 处理内容协商/编组...

由于某种原因,我得到了前面提到的异常:

资源方式:

@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@WebinarSecurityFilter
public Response getXYZ( @QueryParam("startDate") LocalDate start, 
                                    @QueryParam("endDate") LocalDate end, 
                                    @QueryParam("excludesubaccounts") String excludeSubAcc){

    LocalDate now = LocalDate.now();
    LocalDate startDate = start == null ? now.minusDays(30) : start;
    LocalDate endDate = end == null ? now : end;
    boolean excludeSubAccounts = excludeSubAcc != null  && "Y".equalsIgnoreCase(excludeSubAcc);


    List<ABC> resultQuery = abcService.getABCs(clientId, startDate, endDate, excludeSubAccounts);

    CLA cla= new CLA();

    cla.setId(clientId);
    cla.setA(resultQuery);
    cla.setB(resultQuery.size());

    return Response.ok(cla).build();
}

DTO/DTOContainer:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class CLA{

    private long id;
    private long a;
    private long b;

    @XmlElement(name = "abc")
    private List<ABC> ABCs;
//setters & getters
}

DTO:

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class ABC{

// a lot of fields
//setters & getters
}

我在其他 DTO 中使用过同样的场景,那么为什么 this 不起作用?

我的问题是,是否存在特定情况下 Jersey/Jackson 无法完成这项任务而必须手动完成,或者我是否遗漏了什么而只是失明?

这是一个例外:

找不到媒体类型=应用程序/json的MessageBodyWriter, type=class com.CLA, genericType=class com.CLA

不是它有时有效,有时无效,它只是适用于 this 资源方法,即使我有另外两个资源方法做同样的事情,但使用不同的 DTO

【问题讨论】:

  • 在这种“有时有效,有时无效”的情况下,我强烈建议您发布真实代码。并请发布您的依赖项。我什至不必测试,而且我已经可以告诉您,如果我测试了您发布的内容(带有我“在脑海中想象”的依赖项),它应该会起作用。请发布足够的真实信息,您已经测试过实际失败。并发布整个堆栈跟踪。
  • 正如我在问题中提到的,同样的场景用于两个不同的 DTO,它们工作得很好。我的问题很明确。
  • 我认为向 DTO 添加几个字段根本不会给你任何信息,我提供所有代码的唯一地方是资源方法。
  • 我从来没有说过“有时有效,有时无效”,但让我重新表述我的问题,尽量让它更清楚。
  • 好吧,我可以在没有测试的情况下告诉你,如果你使用你帖子中的代码,使用 jersey-media-json-jackson,它会起作用(而且我不会得到你的错误提到)。所以我的意思是,问题可能并不明显。您的帖子中包含的内容。我的建议是开始一个具有最小依赖项的新项目。添加just重现问题所需的类(甚至被删除)。并使用所有这些信息更新您的帖子,从依赖项到类,以及您如何提出请求。

标签: java jax-rs jersey-2.0


【解决方案1】:

当错误发生时,您能给出更具体的情况吗?由于我刚刚看到您声明了@Produces 注释但没有@Consumes 注释我认为当您发送请求时会发生此错误?如果是这种情况,只需将其添加到您想要的方法中或将其放在类名上方:

@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })

但如果不是这种情况,可能是因为你需要指定你想要在json中发送请求和接收响应,所以在你的请求头中添加这个:

Content-Type: application/json
Accept: application/json

【讨论】:

  • 事情就是这样,这是唯一发生的地方。它只有一个@Produces,因为它是一个GET
  • 哦,是的,标题是在你放置它们时设置的
  • 尝试在 ABC 课上删除 @XmlRootElement
猜你喜欢
  • 2014-10-17
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多