使用通过 JAXB2 生成的类的 Pbm 封送 XML

Pbm marshaling XML with classes generated via JAXB2

提问人:Pichou Bichou 提问时间:8/30/2023 更新时间:8/31/2023 访问量:38

问:

今天是我想我会发疯的一天。

我想生成一些代码以便能够mashshall/unmarshall XML文件。 我从传递给 JAXB2 的 XSD 开始,以通过 maven 模块生成 Java 类 =>没关系。

然后我使用这些生成的类进行第一次测试以创建基本的 XML 文件,但我遇到以下错误:无法将类型“com.xxx.xxx.AudioService”序列化为元素,因为它缺少@XmlRootElement注释

public static void marshal() throws JAXBException, IOException {
        AudioService audioService = new AudioService();
        
        audioService.setName("TTS1");
        audioService.setEngineClass("Toto");
        
        JAXBContext context = JAXBContext.newInstance(AudioService.class);
        Marshaller mar= context.createMarshaller();
        mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        mar.marshal(audioService, new File("./test.xml"));
    }

但是我生成的类 AudioService 看起来:

package com.xxx.xxx;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlElementRef;
import jakarta.xml.bind.annotation.XmlMixed;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.XmlValue;


@XmlRootElement(name = "audio-service")
public class AudioService {

    @XmlElement(name = "property")
    protected List<AudioService.Property> properties;
    @XmlElement(required = true)
    protected AudioService.Tts tts;

有谁知道为什么会抛出这个错误,因为一切似乎都很好?

请注意,它是在 java 17 下运行的, javax.xml.bind:jaxb-api = 2.3.1 jakarta.xml.bind:jakarta.xml.bind-api=4.0.0

谢谢

java xml jaxb maven-jaxb2-插件

评论

0赞 LMC 8/30/2023
确保使用所需的属性构建实例@XmlElement(required = true)
0赞 jdweng 8/30/2023
需要看到XML文件的开头。root 标签应为“audio-service”,并且区分大小写。问题可能是需要在类定义中定义命名空间。
0赞 Rick O'Sullivan 8/31/2023
下面是一个小型的独立示例项目 READMEZIP,它使用 和 hisrc-higherjaxb-maven-plugin。将样本模式替换为您的模式应该很容易,以查看它是否有助于使用最新的 JAXB。jakarta.xml.bind:jakarta.xml.bind-api:jar:4.0.0org.glassfish.jaxb:jaxb-runtime:jar:4.0.2

答:

0赞 Pichou Bichou 8/31/2023 #1

感谢您的回答,它给了我检查我的依赖项的想法。 最后,我在与我有混合依赖关系的 pom 中找到了 pbm

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>4.0.0</version>
</dependency> I had mix import with : 

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

由于我已经删除了javax.xml.bind包,现在已解决!

再次感谢