使用@xmlrootelement

时间:2017-04-21 00:34:27

标签: java jax-rs jersey-2.0

我试图理解在什么情况下(如果可能的话)会得到这种类型的例外:

  

找不到适用于DTO的媒体类型= application / 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一样使用了这个相同的场景,那么为什么这个不能用呢?

我的问题是,是否有特定的情况,泽西/杰克逊无法完成这项任务,而且必须手动完成,或者我错过了什么,只是失明了?

这是例外:

  

找不到媒体类型= application / json的MessageBodyWriter,   type = class com.CLA,genericType = class com.CLA

它有时不起作用,有时它并不是,它只是这个资源方法工作,即使我有两个其他资源方法使用不同的DTO执行相同的操作

1 个答案:

答案 0 :(得分:0)

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

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

但如果不是这种情况,可能是因为您需要指定要在json中发送请求和接收响应,因此请在请求标头中添加:

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