尝试使用jaxb
将xml响应转换为java对象时出现以下错误 javax.xml.bind.UnmarshalException: unexpected element (uri:"http://SOMETHING/doc/2006-03-01/", local:"Name"). Expected elements are <{}Name>,<{}IsTruncated>,<{}MaxKeys>,<{}Contents>,<{}Prefix>,<{}Marker>
这是我的XML:
<ListBucketResult xmlns="http://something/doc/2006-03-01/">
<Name>test2</Name>
<Prefix/>
<Marker/>
<MaxKeys>3</MaxKeys>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>metadata.xml</Key>
<LastModified>2012-09-04T08:29:36.000Z</LastModified>
<ETag>6b836fd43c402681506926b2248ec418</ETag>
<Size>3258</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
</ListBucketResult>
我的java对象类是这样的
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"name",
"prefix",
"marker",
"maxKeys",
"isTruncated",
"contents"
})
@XmlRootElement(name = "ListBucketResult")
public class ListBucketResult {
@XmlElement(name = "Name", required = true)
protected String name;
@XmlElement(name = "Prefix", required = true)
protected String prefix;
@XmlElement(name = "Marker", required = true)
protected String marker;
@XmlElement(name = "MaxKeys")
protected int maxKeys;
@XmlElement(name = "IsTruncated")
protected boolean isTruncated;
@XmlElement(name = "Contents", required = true)
protected ListBucketResult.Contents contents;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"key",
"lastModified",
"eTag",
"size",
"storageClass"
})
public static class Contents {
@XmlElement(name = "Key", required = true)
protected String key;
@XmlElement(name = "LastModified", required = true)
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar lastModified;
@XmlElement(name = "ETag", required = true)
protected String eTag;
@XmlElement(name = "Size")
protected int size;
@XmlElement(name = "StorageClass", required = true)
protected String storageClass;
最后我的解组代码是:
JAXBContext jc = JAXBContext.newInstance(ListBucketResult.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());
JAXBElement element = (JAXBElement) unmarshaller.unmarshal (inputStream);
ListBucketResult customer = (ListBucketResult) element.getValue();
有人可以让我知道我做错了什么吗?
答案 0 :(得分:5)
您可以在@XmlSchema
类上使用package-info
注释来控制命名空间限定。如果你已经编写了一个package-info类,请确保它正在被编译(某些版本的ant在package-info类中有问题)。
<强>包信息强>
@XmlSchema(
namespace = "http://something/doc/2006-03-01/",
elementFormDefault = XmlNsForm.QUALIFIED)
package example;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
了解更多信息
答案 1 :(得分:3)
XML文档包含属于“http:// something / doc / 2006-03-01 /”命名空间的元素,但带注释的java类与该命名空间无关。尝试将@XmlType注释更改为:
@XmlType(name = "", namespace="http://something/doc/2006-03-01/", propOrder = { ...
答案 2 :(得分:0)
我收到类似的错误 org.codehaus.jackson.JsonParseException 和 javax.xml.bind.UnmarshalException :带有链接异常:[ javax.xml。 bind.UnmarshalException:意外元素(uri:“sometext”,local:“elementA”)。预期元素。
这是将 RESTEasy 和 Spring 与使用 JAXB 生成的DTO集成的时间。我正在使用 Jackson 进行转换。
为了解决这个问题,我在Maven依赖中引入了Jackson库,它解决了我的问题。特定于此的杰克逊依赖是
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
<version>1.9.9</version>
</dependency>
我还需要其他杰克逊罐子,所以我的POM基本上如下所示。
//The jackson-core-asl jar contains streaming JSON parser and generator interfaces and implementations
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.9</version>
</dependency>
//Ability to use JAXB annotations containing classes needed to add XML compatibility support.
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
<version>1.9.9</version>
</dependency>
//Mapper jar contains functionality for data binding:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.9</version>
</dependency> //This dependency makes a JAX-RS implementation like Jersey,RESTEasy use Jackson for binding of JSON to-from Java objects
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.9</version>
</dependency>