JAXBException:属性出现在 @XmlType.propOrder 中,但不存在此类属性

问题描述 投票:0回答:1

我有一个保存命令,可以进行简单的编组:

//save command
...
        try {
            JAXBContext context = JAXBContext.newInstance(CollectionManager.class);            
            Marshaller marshaller = context.createMarshaller();

            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(collectionManager, new File("out.xml"));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
...

这里是带有 PrioriyQueue 存储 MusicBands 的 collectionManager

@XmlRootElement(name = "Collection")
@XmlAccessorType(XmlAccessType.FIELD)
public class CollectionManager {

...

    @XmlElement(name = "MusicBand")
    private  PriorityQueue<MusicBand> musicBandsQueue;

...

这里是 MusicBand 类字段:

@XmlType(propOrder = {"id","name","coordinates", "numberOfParticipants", "creationDate", "albumsCount", "establishmentDate", "genre", "label"})
public class MusicBand implements Comparable<MusicBand> {
    private long id;
    private String name;
    private Coordinates coordinates; 
    private java.util.Date creationDate; 
    private int numberOfParticipants; 
    private Long albumsCount;
    private java.time.ZonedDateTime establishmentDate;
    private MusicGenre genre;
    private Label label;

...

因此,当我从 propOrder 中排除“creationDate”时,我几乎得到了所需的 xml 文件,但“estinationDate”字段除外。我不知道会发生什么。

它看起来是这样的。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Collection>
    <MusicBand>
        <id>1</id>
        <name>asd</name>
        <coordinates>
            <x>1</x>
            <y>1</y>
        </coordinates>
        <numberOfParticipants>1</numberOfParticipants>
        <albumsCount>1</albumsCount>
        <establishmentDate/>
        <genre>SOUL</genre>
        <label>
            <bands>2</bands>
            <name>asd</name>
        </label>
    </MusicBand>
    <previousIds>1</previousIds>
</Collection>

但是如果我在 propOrder 中包含“creationDate”,我会得到一个异常。这是堆栈跟踪:

org.glassfish.jaxb.runtime.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Property creationDate appears in @XmlType.propOrder, but no such property exists. Maybe you meant coordinates? 
        this problem is related to the following location:
                at ru.itmo.prog.lab5.collection.MusicBand.MusicBand
                at private java.util.PriorityQueue ru.itmo.prog.lab5.CLI.Managers.CollectionManager.musicBandsQueue
                at ru.itmo.prog.lab5.CLI.Managers.CollectionManager

        at org.glassfish.jaxb.runtime.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:83)
        at org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:421)      
        at org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:255)
        at org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1115)
        at org.glassfish.jaxb.runtime.v2.ContextFactory.createContext(ContextFactory.java:144)
        at org.glassfish.jaxb.runtime.v2.JAXBContextFactory.createContext(JAXBContextFactory.java:44)
        at jakarta.xml.bind.ContextFinder.find(ContextFinder.java:373)
        at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:605)
        at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:546)
        at ru.itmo.prog.lab5.CLI.Commands.Save.execute(Save.java:22)
        at ru.itmo.prog.lab5.CLI.Managers.CommandManager.executeCommand(CommandManager.java:58)
        at ru.itmo.prog.lab5.Main.main(Main.java:19)

不知道为什么这可能是一个问题。日期编组在 baeldung 的 jaxb guide 中运行良好。任何帮助将不胜感激。

java date jaxb marshalling
1个回答
0
投票

为了解决这个问题,我在 StackOverflow 上找到了下一个问题(如果你有和我类似的问题,那么所有这些问题都值得一读):firstsecond。因此,在其中一条评论中,我发现了一个开源库 Threeten-jaxb ,它有助于

@JavaTypeAdapter
注释。 就我而言,我需要一个 ZonedDateTime 字段的类,我在那里找到了它,它被称为
ZonedDateTimeXmlAdapter
。至于
java.util.Date
字段,我刚刚创建了我个人的 DateAdapter 类,如上面提到的第一个问题中所述。

重要提示:我必须将注释放在 getter 之上,而不是实际的字段,否则我会得到一个异常,即有 2 个或多个属性以相同的方式命名。实际上并没有弄清楚为什么会这样,只是尝试了不同的方法将注释放在不同的地方......

由于自定义 DateAdapter 类而留下的唯一小缺点是我在 xml 中的日期标记中丢失了一个城镇,但就我而言,这并不那么重要。这是我收集的内容:

created: Thu Mar 14 12:35:50 MSK 2024
,这是我在 xml 中得到的内容:
<creationDate>2024-03-14 12:35:50</creationDate>
在 Threeten 库中没有找到合适的类来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.