gpt4 book ai didi

java - 无法将条目强制转换为 javax.xml.bind.JAXBElement

转载 作者:行者123 更新时间:2023-11-29 07:32:52 25 4
gpt4 key购买 nike

我不断收到 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 类的前 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;

这是我的 Entries 类,用于获取 Entry 对象列表:

@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)公开课入口{

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>

最佳答案

据我所知,您当前的代码中存在几个问题。此处列出的第二个问题是异常的根本原因。

1。没有提供给 JAXBContext.newInstance(Class)

的正确类

你应该提供根元素的类,在你的情况下它似乎是 Entries 所以它应该是 JAXBContext.newInstance(Entries.class)

2。提取 Entries 实例的方式

预期的代码是这样的:

Entries itsEntries = (Entries)unmarshaller.unmarshal(new StringReader(output));

这实际上就是您获得此异常的原因,因为 unmarshal 直接提供了与根元素对应的类型,而不是您似乎期望的 JAXBElement

3。映射不正确

到目前为止,在类 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 个类 EntryEntries,它们使用注释 @XmlRootElement(name = "Entries") 这样 JAXB 在找到名称为 Entries 的根元素时无法知道要使用哪个类,在您的情况下类 Entries 是唯一的根元素,所以注释应该只设置在这个类上。类 Entry 的映射已经定义在字段 entryList 的映射上,因此您无需在类上设置此注释。

@XmlAccessorType(XmlAccessType.FIELD)
public class Entry {
...
}

@XmlRootElement(name = "Entries")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entries {
...
}

第三个问题与您没有正确映射 Entries 类中的元素 Entry 这一事实有关,这实际上是您有一个空列表的原因当您尝试解码您的 XML 内容时,正确的映射是:

@XmlElement(name="Entry")
private List<Entry> entryList = new ArrayList<Entry>();

4。无需扩展 Object

假设您指的是 java.lang.Object,则无需使您的类 Entries extends java.lang.Object 因为它是隐式的。

关于java - 无法将条目强制转换为 javax.xml.bind.JAXBElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com