当前位置: 首页 > 知识库问答 >
问题:

不能将条目强制转换为javax.xml.bind.JaxbElement

令狐功
2023-03-14

我一直收到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();
    }
@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;
@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;
    }

}

错误消息:

不能将条目强制转换为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(XmlAccessStype.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个答案

南门鸿畴
2023-03-14

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

您应该提供根元素的类,在您的示例中,它似乎是entries,因此它应该是jaxbcontext.newInstance(entries.class)

预期的代码是这样的:

Entries itsEntries = (Entries)unmarshaller.unmarshal(new StringReader(output));
@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;
    }

第二个问题是,您有两个类entryentry使用注释@XMLRootElement(name=“entries”)与完全相同的元素名称映射,这样当JAXB找到一个名为entry的根元素时,它就无法知道该使用哪个类,在您的情况下,entry类是唯一的根元素,因此注释应该只在这个类上设置。类entry的映射已经在字段entrylist的映射上定义,因此您不需要在类上设置此批注。

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

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

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

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

假设您引用的是java.lang.Object,您不需要使您的类Entries扩展java.lang.Object,因为它是隐式的。

 类似资料: