有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么时候JAXB可以用于Json而不是XML?

我有一个简单的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) 个答案

  1. # 1 楼答案

    这是一个愚蠢的错误,但确实是进行编组/解编所必需的

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

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