条目无法转换为 javax.xml.bind.JAXBElement
Entry cannot be cast to javax.xml.bind.JAXBElement
我不断收到 JAXB 转换错误。
我现在不确定要更正什么。
解组:
try{
Client client = Client.create();
client.addFilter(new HTTPBasicAuthFilter(API_KEY, ""));
WebResource webResource = client.resource("https://url.entries.xml");
webResource.setProperty("", API_KEY);
ClientResponse response = webResource.accept("application/xml").get(ClientResponse.class);
if(response.getStatus() != 200){
throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
}
String output = response.getEntity(String.class);
System.out.println("\n============getFtoCResponse============");
System.out.println(output);
JAXBContext jaxbContext = JAXBContext.newInstance(Entries.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Entries itsEntries = (Entries)((JAXBElement)unmarshaller.unmarshal(new StringReader(output))).getValue();
/* Object o = unmarshaller.unmarshal(new StringReader(output));
System.out.println(o.getClass());*/
}catch(Exception e){
e.printStackTrace();
}
这是我的 Entry.java class 的前 16 行,我已经注释了 setter 和 getter:
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entry {
private String DateCreated;
private String EntryId;
private String Field1;
private String Field2;
private String Field3;
private String Field4;
这是我的条目 class,用于获取条目对象列表:
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entries extends Object {
@XmlElement(name="Entries")
private List<Entry> entryList = new ArrayList<Entry>();
@XmlElement(name="Entries")
public List<Entry> getEntryList() {
return entryList;
}
public void setEntryList(List<Entry> entryList) {
this.entryList = entryList;
}
}
错误信息:
Entry cannot be cast to javax.xml.bind.JAXBElement
问题更新
条目:
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entries {
@XmlElement(name = "Entries")
private List<Entry> entryList = new ArrayList<Entry>();
public List<Entry> getEntryList() {
return this.entryList;
}
public void setEntryList(List<Entry> entryList) {
this.entryList = entryList;
}
}
条目:
@XmlAccessorType(XmlAccessType.FIELD)
public class条目{
private String DateCreated;
private String EntryId;
private String Field1;
private String Field2;
private String Field3;
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Entries>
<Entry>
<EntryId>1</EntryId>
<Field3>John</Field3>
<Field4>Doe</Field4>
<Field12>21 jump street</Field12>
<Field14></Field14>
<Field15>USA</Field15>
<Field11>USA</Field11>
</Entry>
</Entries>
将 jaxbcontext 实例化更改为
JAXBContext.newInstance(Entries.class);
据我所知,您当前的代码中存在几个问题。此处列出的第二个问题是您出现异常的根本原因。
1。不正确 class 提供给 JAXBContext.newInstance(Class)
你应该提供根元素的 class 在你的情况下似乎是 Entries
所以它应该是 JAXBContext.newInstance(Entries.class)
2。提取 Entries
实例的方式
预期的代码是这样的:
Entries itsEntries = (Entries)unmarshaller.unmarshal(new StringReader(output));
这实际上是您得到此异常的原因,因为 unmarshal
直接提供了与根元素对应的类型,而不是您似乎期望的 JAXBElement
。
3。映射不正确
到目前为止,在 class Entries
中,Entries
在字段 entryList
和方法 getEntryList()
上映射了两次,这是不正确的因为你只需要映射一次,因为你设置了注释@XmlAccessorType(XmlAccessType.FIELD)
,你应该只注释字段。
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entries {
@XmlElement(name="Entries")
private List<Entry> entryList = new ArrayList<Entry>();
public List<Entry> getEntryList() {
return entryList;
}
第二个问题是您有 2 个 classes Entry
和 Entries
,它们使用注释 @XmlRootElement(name = "Entries")
映射到完全相同的元素名称,例如JAXB 在找到名称为 Entries
的根元素时不知道要使用哪个 class,在您的情况下,class Entries
是唯一的根元素,因此注释应该仅在此 class 上设置。 class Entry
的映射已经在字段 entryList
的映射上定义,因此您无需在 class.[=39= 上设置此注释]
@XmlAccessorType(XmlAccessType.FIELD)
public class Entry {
...
}
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entries {
...
}
第三个问题与您没有正确映射 class Entries
中的元素 Entry
有关,这实际上是您有一个空列表的原因当您尝试解组 XML
内容时,正确的映射是:
@XmlElement(name="Entry")
private List<Entry> entryList = new ArrayList<Entry>();
4。无需扩展 Object
假设您指的是 java.lang.Object
,您无需使 class Entries
扩展 java.lang.Object
,因为它是隐含的。
我不断收到 JAXB 转换错误。
我现在不确定要更正什么。
解组:
try{
Client client = Client.create();
client.addFilter(new HTTPBasicAuthFilter(API_KEY, ""));
WebResource webResource = client.resource("https://url.entries.xml");
webResource.setProperty("", API_KEY);
ClientResponse response = webResource.accept("application/xml").get(ClientResponse.class);
if(response.getStatus() != 200){
throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
}
String output = response.getEntity(String.class);
System.out.println("\n============getFtoCResponse============");
System.out.println(output);
JAXBContext jaxbContext = JAXBContext.newInstance(Entries.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Entries itsEntries = (Entries)((JAXBElement)unmarshaller.unmarshal(new StringReader(output))).getValue();
/* Object o = unmarshaller.unmarshal(new StringReader(output));
System.out.println(o.getClass());*/
}catch(Exception e){
e.printStackTrace();
}
这是我的 Entry.java class 的前 16 行,我已经注释了 setter 和 getter:
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entry {
private String DateCreated;
private String EntryId;
private String Field1;
private String Field2;
private String Field3;
private String Field4;
这是我的条目 class,用于获取条目对象列表:
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entries extends Object {
@XmlElement(name="Entries")
private List<Entry> entryList = new ArrayList<Entry>();
@XmlElement(name="Entries")
public List<Entry> getEntryList() {
return entryList;
}
public void setEntryList(List<Entry> entryList) {
this.entryList = entryList;
}
}
错误信息:
Entry cannot be cast to javax.xml.bind.JAXBElement
问题更新
条目:
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entries {
@XmlElement(name = "Entries")
private List<Entry> entryList = new ArrayList<Entry>();
public List<Entry> getEntryList() {
return this.entryList;
}
public void setEntryList(List<Entry> entryList) {
this.entryList = entryList;
}
}
条目:
@XmlAccessorType(XmlAccessType.FIELD) public class条目{
private String DateCreated;
private String EntryId;
private String Field1;
private String Field2;
private String Field3;
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Entries>
<Entry>
<EntryId>1</EntryId>
<Field3>John</Field3>
<Field4>Doe</Field4>
<Field12>21 jump street</Field12>
<Field14></Field14>
<Field15>USA</Field15>
<Field11>USA</Field11>
</Entry>
</Entries>
将 jaxbcontext 实例化更改为 JAXBContext.newInstance(Entries.class);
据我所知,您当前的代码中存在几个问题。此处列出的第二个问题是您出现异常的根本原因。
1。不正确 class 提供给 JAXBContext.newInstance(Class)
你应该提供根元素的 class 在你的情况下似乎是 Entries
所以它应该是 JAXBContext.newInstance(Entries.class)
2。提取 Entries
实例的方式
预期的代码是这样的:
Entries itsEntries = (Entries)unmarshaller.unmarshal(new StringReader(output));
这实际上是您得到此异常的原因,因为 unmarshal
直接提供了与根元素对应的类型,而不是您似乎期望的 JAXBElement
。
3。映射不正确
到目前为止,在 class Entries
中,Entries
在字段 entryList
和方法 getEntryList()
上映射了两次,这是不正确的因为你只需要映射一次,因为你设置了注释@XmlAccessorType(XmlAccessType.FIELD)
,你应该只注释字段。
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entries {
@XmlElement(name="Entries")
private List<Entry> entryList = new ArrayList<Entry>();
public List<Entry> getEntryList() {
return entryList;
}
第二个问题是您有 2 个 classes Entry
和 Entries
,它们使用注释 @XmlRootElement(name = "Entries")
映射到完全相同的元素名称,例如JAXB 在找到名称为 Entries
的根元素时不知道要使用哪个 class,在您的情况下,class Entries
是唯一的根元素,因此注释应该仅在此 class 上设置。 class Entry
的映射已经在字段 entryList
的映射上定义,因此您无需在 class.[=39= 上设置此注释]
@XmlAccessorType(XmlAccessType.FIELD)
public class Entry {
...
}
@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entries {
...
}
第三个问题与您没有正确映射 class Entries
中的元素 Entry
有关,这实际上是您有一个空列表的原因当您尝试解组 XML
内容时,正确的映射是:
@XmlElement(name="Entry")
private List<Entry> entryList = new ArrayList<Entry>();
4。无需扩展 Object
假设您指的是 java.lang.Object
,您无需使 class Entries
扩展 java.lang.Object
,因为它是隐含的。