无法使用 JAXB 配置 Moxy

shi*_*har 5 java xml jaxb maven moxy

我在我的代码集中使用 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 来下载依赖项。持久性.moxy -->

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.moxy</artifactId>
     <version>2.4.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

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

JAXBContext jaxbContext = JAXBContext.newInstance(DocGenerator.class); 
System.out.println(jaxbContext.getClass());
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮忙吗?

and*_*mes 4

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

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

根据此处的说明,我将所需的属性文件添加到包含我的域类(我想要序列化的带注释的 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>
Run Code Online (Sandbox Code Playgroud)

JAR 的解决方案

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

资源目录

将此特定配置文件放入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>
Run Code Online (Sandbox Code Playgroud)

MOXy 版本 3 的更新

上述注释适用于 MOXy 版本 2.7.6。

要使用版本 3+,您需要考虑最近将许多javax软件包传输到雅加达的情况。您可以在此处阅读这一举措的背景。

升级项目的步骤:

  1. 将文件更改jaxb.properties为以下内容:
jakarta.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)

jakarta请注意对绑定上下文的此处引用的更改。

  1. 将所有jaxb 导入更改为引用jakarta而不是javax. 因此,例如,更改此:
        <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>
Run Code Online (Sandbox Code Playgroud)

对此:

jakarta.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)
  1. 在您的 中使用以下两个依赖项pom.xml
import javax.xml.bind.JAXBContext; // old import
Run Code Online (Sandbox Code Playgroud)

这两个依赖项足以支持此处提供的代码示例的更新版本:使用 MOXy 的基于 XPath 的映射