什么时候JAXB会为Json而不是XML工作?

时间:2017-05-23 20:36:38

标签: java json xml jaxb jackson

我有一个简单的Java RESTful API端点,可以让Jersey处理编组。

accept=application/json工作正常并返回预期时。

accept=application/xml返回500 server error

在什么情况下编组为json而不是xml工作,我错过了什么?

这是我的代码:

资源方法:

@GET
@Path("/client/{clientId}/technicalrep")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@WebinarSecurityFilter
@WebinarClientValidationFilter
public Response getTechnicalRepContacts(@PathParam("clientId") Long clientId, @HeaderParam("accept") String accept){

    if (isAcceptInvalid(accept)) {
        return Response.status(Response.Status.PRECONDITION_FAILED).entity(new PlatformApiMessage().withMessage("The header parameter Accept is mandatory")).build();
    }

    List<ClientTechnicalContact> technicalContacs = wccClientService.findClientTechnicalContactsByClientId(clientId);

    if (technicalContacs == null || technicalContacs.size() == 0) {
        return Response.ok(new PlatformApiMessage().withMessage("No Technical Rep Contacts found.")).build();
    } else {
        ClientLevelTechnicalContacts clientLevelTechnicalContacts = new ClientLevelTechnicalContacts(clientId,technicalContacs);
        return Response.ok(clientLevelTechnicalContacts).build();
    }
}

DTO:

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

    private long clientid;

    @XmlElement(name = "technicalcontact")
    private List<ClientTechnicalContact> technicalcontacts;

    public ClientLevelTechnicalContacts(long clientid,List<ClientTechnicalContact> technicalcontacts) {
        this.clientid = clientid;
        this.technicalcontacts = technicalcontacts;
    }

    public long getClientid() {
        return clientid;
    }

    public void setClientid(long clientid) {
        this.clientid = clientid;
    }

    public List<ClientTechnicalContact> getTechnicalcontacts() {
        return technicalcontacts;
    }

    public void setTechnicalcontacts(List<ClientTechnicalContact> technicalcontacts) {
        this.technicalcontacts = technicalcontacts;
    }   
}


@XmlRootElement(name="technicalcontacts")
@XmlAccessorType(XmlAccessType.FIELD)
public class ClientTechnicalContact {

    private long contactid;
    private String contactname;

    public ClientTechnicalContact(){}

    public ClientTechnicalContact(long contactid, String contactname) {
        super();
        this.contactid = contactid;
        this.contactname = contactname;
    }

    public long getContactid() {
        return contactid;
    }
    public void setContactid(long contactid) {
        this.contactid = contactid;
    }
    public String getContactname() {
        return contactname;
    }
    public void setContactname(String contactname) {
        this.contactname = contactname;
    }

}

1 个答案:

答案 0 :(得分:0)

愚蠢的错误,但确实是编组/解组的必要条件。

每个DTO必须有一个默认/空构造函数,否则它将无法工作,而ClientLevelTechnicalContacts缺少一个空构造函数。

我不明白为什么没有更好的堆栈跟踪。无论如何,解决方案是在ClientLevelTechnicalContacts中放置一个空构造函数。