xml RESTful 问题的最简单 Jersey 客户端
Simplest Jersey Client for xml RESTful issue
我有一个网络资源 returns 这个 XML:
<?xml version="1.0" encoding="utf-8"?>
<messagebody
xmlns="http://api.esendex.com/ns/">
<bodytext>blablabla</bodytext>
<characterset>blabla</characterset>
</messagebody>
我为此写了一个简单的 class:
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;
}
}
还有一个简单的主要 class:
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 解组有问题。我收到以下异常:
javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://api.esendex.com/ns/", local:"messagebody"). Expected elements are <{}messagebody>
据我所知,我已经正确设置了注释。
我做错了什么?
JAXB 有它自己的名称空间处理机制。我猜它在看到你之前失败了(由于缺乏适当的注释)class 想要处理命名空间。
您可以通过在与 class 相同的包中创建一个 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;
我有一个网络资源 returns 这个 XML:
<?xml version="1.0" encoding="utf-8"?>
<messagebody
xmlns="http://api.esendex.com/ns/">
<bodytext>blablabla</bodytext>
<characterset>blabla</characterset>
</messagebody>
我为此写了一个简单的 class:
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;
}
}
还有一个简单的主要 class:
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 解组有问题。我收到以下异常:
javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://api.esendex.com/ns/", local:"messagebody"). Expected elements are <{}messagebody>
据我所知,我已经正确设置了注释。
我做错了什么?
JAXB 有它自己的名称空间处理机制。我猜它在看到你之前失败了(由于缺乏适当的注释)class 想要处理命名空间。
您可以通过在与 class 相同的包中创建一个 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;