最简单的Jersey客户端,用于xml RESTful问题

时间:2015-06-26 14:25:34

标签: java xml rest jaxb jersey

我有一个返回此XML的webresource:

<?xml version="1.0" encoding="utf-8"?>
<messagebody 
    xmlns="http://api.esendex.com/ns/">
    <bodytext>blablabla</bodytext>
    <characterset>blabla</characterset>
</messagebody>

我为此写了一个简单的类:

package com.example;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "messagebody")
public class MessageBody {
    private String xmlns;
    private String bodytext;
    private String characterset;

    public String getXmlns() {
        return xmlns;
    }

    @XmlAttribute
    public void setXmlns(String xmlns) {
        this.xmlns = xmlns;
    }

    public String getBodytext() {
        return bodytext;
    }

    @XmlElement
    public void setBodytext(String bodytext) {
        this.bodytext = bodytext;
    }

    public String getCharacterset() {
        return characterset;
    }

    @XmlElement
    public void setCharacterset(String characterset) {
        this.characterset = characterset;
    }
}

一个简单的主要课程:

package com.example;

import javax.ws.rs.core.MediaType;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        try {

            Client client = Client.create();
            client.addFilter(new HTTPBasicAuthFilter("***", "****"));
            WebResource webResource = client
                    .resource("http://myresturl");


            ClientResponse response = webResource.type(MediaType.APPLICATION_XML).get(ClientResponse.class);
            if (response.getStatus() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + response.getStatus());
            }

            MessageBody body = response.getEntity(MessageBody.class);
            System.out.println(body.getBodytext());


        } catch (Exception e) {

            e.printStackTrace();

        }
    }
}

我通过了身份验证,我得到了正确的XML,但是xml unmarshelling出了问题。我得到以下异常:

javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://api.esendex.com/ns/", local:"messagebody"). Expected elements are <{}messagebody>

根据我的理解,我已正确设置注释。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

JAXB拥有自己的命名空间处理机制。我猜它失败了(由于缺少适当的注释),才能看到你的类想要处理命名空间。

您可以通过在与该类相同的包中创建package-info.java文件来修复它,然后使用@XmlSchema注释来声明命名空间

@XmlSchema(
        elementFormDefault = XmlNsForm.QUALIFIED,
        namespace = "http://api.esendex.com/ns/"
)
package com.example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

您可以看到有关名称空间处理的更多信息,herehere