【问题标题】:Not able to configure Moxy using JAXB无法使用 JAXB 配置 Moxy
【发布时间】:2023-03-27 00:03:01
【问题描述】:

我在我的代码集中使用 JAXB 的 Moxy 实现并尝试使用 @XMLPath 创建路径,但它似乎不起作用。我有一个基于 Spring 的项目,我在 /project/WEB/src/main/resources 下创建了 jaxb.properties,内容如下:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

我的类放在/project/WEB/src/main/java下 我已将 pom.xml 配置为下载依赖项。 persistence.moxy -->

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.moxy</artifactId>
     <version>2.4.0</version>
</dependency>

当我在 WAS 服务器上运行代码时,无法识别 Moxy 并且未创建路径。不知道我做错了什么。

我什至尝试测试我的 JAXBContext 类,但我在控制台上得到的是:

JAXBContext jaxbContext = JAXBContext.newInstance(DocGenerator.class); 
System.out.println(jaxbContext.getClass());

com.sun.xml.bind.v2.runtime.JAXBContextImpl 类

有人可以帮忙吗?

【问题讨论】:

    标签: java xml maven jaxb moxy


    【解决方案1】:

    如果这对其他人有帮助,以下解决了我最近的“MOXy 已配置但被忽略”的问题。

    我通过实现@XmlPath Javadoc 中显示的第一个示例在 Java 11(Open JDK)上对其进行了测试。

    按照here 的说明,我将所需的属性文件添加到包含我的域类(我想要序列化的带注释的bean)的包中。

    我的 IDE 解决方案

    我最初忘记做的步骤是:

    我的 IDE 仅将已编译的 .class 文件复制到目标目录 - 它不会复制任何其他内容(例如我的属性文件)。

    呃。

    如何解决这个问题取决于您的 IDE。对我来说,这是对我项目的 ant 构建配置的简单更改。

    如果您使用的是 Maven,那么pom.xml 中的构建步骤如下:

    <build>  
        <resources>  
            <resource>  
                <directory>src/main/java</directory>  
                <excludes>  
                    <exclude>**/*.java</exclude>  
                </excludes>  
            </resource>  
        </resources>  
    </build>
    

    JAR 解决方案

    同样,需要指示 Maven 将文件复制到 JAR 中的该文件夹中。有多种方法可以做到这一点。一些答案请参见this question

    资源目录

    将此特定配置文件放入resources 目录并 工作(至少,它对我不起作用)。 MOXy 说明非常具体 - 需要严格遵守。

    POM 依赖项

    在 Java 11 中,模块 java.se.ee 已被删除。见JEP-320。该模块包括 JAXB(和 JAX-WS)。要在 Java 11 及更高版本中使用 JAXB,您需要将其作为单独的库添加到您的项目中。

    鉴于此,这里是我的 POM 依赖项,记录在案:

            <dependency>
                <groupId>com.sun.activation</groupId>
                <artifactId>javax.activation</artifactId>
                <version>1.2.0</version>
            </dependency>
            
            <!-- 
                 Use 2.3.1 below to prevent "illegal 
                 reflective access operation" warnings.
            -->
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.3.1</version>
            </dependency>
            
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-core</artifactId>
                <version>2.3.0.1</version>
            </dependency>
            
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-impl</artifactId>
                <version>2.3.1</version>
            </dependency>
            
            <dependency>
                <groupId>org.eclipse.persistence</groupId>
                <artifactId>eclipselink</artifactId>
                <version>2.7.6</version>
            </dependency>
    

    MOXy 第 3 版的更新

    以上说明适用于 MOXy 版本 2.7.6。

    要使用版本 3+,您需要考虑到最近将许多 javax 包转移到 Jakarta。你可以阅读这个动作的背景here

    升级项目的步骤:

    1. jaxb.properties 文件更改为以下内容:
    jakarta.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
    

    请注意这里对 jakarta 的更改引用,用于绑定上下文。

    1. 将您的 jaxb 导入的 all 更改为引用 jakarta 而不是 javax。所以,例如,改变这个:
    import javax.xml.bind.JAXBContext; // old import
    

    到这里:

    import jakarta.xml.bind.JAXBContext; // new import
    
    1. 在您的pom.xml 中使用以下两个依赖项:
    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
        <version>3.0.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>3.0.0</version>
    </dependency>
    

    这两个依赖项足以支持此处提供的代码示例的更新版本:XPath Based Mapping using MOXy

    【讨论】:

    • 我正在努力让@XmlPath 工作。我有一个 Maven 项目,我拥有所有的 Maven 依赖项,但有一个更新版本。我在classpackage 中有属性文件,我在JAXBContext 中使用JAX searlization。在我看来一切都很好,但@XmlPath 仍然对生成的 XML 文件没有影响。无论有没有@XmlPath,它都会产生相同的结果。我有 maven 依赖项,所以我必须再次将 JAR 添加到我的类路径中吗?我正在使用IntelliJ IDE 如何让 iDE 获取属性文件?
    • @BATMAN_2008 - 您是否检查过您的应用程序正在使用哪个 JAXB 实现?您可以使用问题中的代码来执行此操作:JAXBContext jaxbContext = JAXBContext.newInstance(YourClassNameGoesHere.class); 然后System.out.println(jaxbContext.getClass());
    • 您好,非常感谢您的回复。是的,我确实检查过。它告诉我class com.sun.xml.bind.v2.runtime.JAXBContextImpl。我已经把我的问题完全贴在这里了,如果你有机会请看看并提供你的解决方案:stackoverflow.com/questions/67500565/…
    • @BATMAN_2008 - 好的 - 这是 Metro 实施 - 不是 MOXy。所以是的,某处存在配置问题。如果可以的话,我会看看你的问题。
    • 非常感谢这对我有帮助。这应该可以工作,除非由于我拥有的另一个依赖项而存在一些冲突:stackoverflow.com/questions/67500565/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多