@XmlPath 在 JAXB 编组期间没有影响
@XmlPath has no impact during the JAXB Marshalling
我正在尝试使用 JaxB Marshalling
方法创建 XML。我想跳过某些子元素的父标签,或者可以为某个元素添加新的 XML
父标签。因此,我正在尝试使用 import org.eclipse.persistence.oxm.annotations.XmlPath;
.
中的 @XmlPath
我正在关注创始人 (Blog on @XmlPath) 的博客以使其正常工作,但由于某种原因,@XmlPath
没有影响并且输出 XML 不匹配显示在博客中。我遵循了博客中提到的所有过程,也提到了这里的各种答案。
我所有的 classes 都在 model.jaxb
包中。此外,我在该包中创建了一个 jaxb.properties
文件。
以下是我的Customer
class:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@Getter
@Setter
@NoArgsConstructor
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
@XmlPath("contact-info/billing-address")
private Address billingAddress;
@XmlPath("contact-info/shipping-address")
private Address shippingAddress;
}
以下是我的Address
class:
@Getter
@Setter
@NoArgsConstructor
public class Address {
private String street;
}
以下是Demo
class:
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Customer customer = new Customer();
Address billingAddress = new Address();
billingAddress.setStreet("1 Billing Street");
customer.setBillingAddress(billingAddress);
Address shippingAddress = new Address();
shippingAddress.setStreet("2 Shipping Road");
customer.setShippingAddress(shippingAddress);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(customer, System.out);
}
}
我得到的XML和没有@XmlPath
其实是一样的。所以似乎 @XmlPath
在编组期间没有影响。
<customer>
<billingAddress>
<street>1 Billing Street</street>
</billingAddress>
<shippingAddress>
<street>2 Shipping Road</street>
</shippingAddress>
</customer>
我在 package model.jaxb
中创建了 jaxb.properties
文件,内容为:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
根据博客,输出 XML 应该是这样的:
<customer>
<contact-info>
<billing-address>
<street>1 Billing Street</street>
</billing-address>
<shipping-address>
<street>2 Shipping Road</street>
</shipping-address>
</contact-info>
<customer>
我不确定我做错了什么导致我无法获得我期望的 XML。我尝试了很多东西,但 none 成功了,所以在这里发布相同的东西。
有人可以帮我解决如何在编组期间踢 @XmlPath
以便在编组期间获得预期的标签吗?
**** 已编辑 *****
我正在根据 Intellij IDE File -> Project Structure
使用 Java 版本 15.0.01。我看到一个答案,其中提到 Moxy
在 Java 11
Answer Java 11.0 above.
的正上方不起作用
所以我做了以下事情:
- 我添加了上述答案中提到的依赖项和
build
,所以我的 pom.xml
看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>model.jaxb</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>model-jaxb</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
<version>1.2.0</version>
</dependency>
<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>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
</project>
当我 运行 程序然后我得到错误:
Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/xml/bind/JAXBException
Caused by: java.lang.ClassNotFoundException: jakarta.xml.bind.JAXBException
我尝试了很多 Whosebug for this error and most of the answers mentioned adding the
dependency 中提到的东西` 我已经添加了答案中提到的所有依赖项。我不确定出了什么问题。
有人可以帮我解决这个问题吗?
在@andrewjames 的大力帮助下,终于找到了解决方案。发布相同的解决方案,以便有人可以快速找到解决方案,而不会像我一样花费一整天:)
您也可以按照@andrewjames in his answer提到的步骤进行操作。
确保在与域 class 相同的包中只有 jaxb.properties
文件的一个副本(在这种情况下将在编组期间使用的副本Customer.class
)。文件内容应为:
jakarta.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
2.Remove 来自 pom.xml
文件的所有依赖项,只需添加以下 2 个依赖项:
<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>
- 确保所有 classes(在本例中为
Customer.class
和 Demo.ckass
)都使用来自 import jakarta.xml.bind.JAXBContext;
. 的导入
之前取自 import javax.xml.bind.JAXBContext;
应该取自 import jakarta.xml.bind.JAXBContext;
。
我正在对 Demo.class
进行更改,但忘记在 Customer.class
中进行更改,所以看到了一些 defclass
问题。因此,请确保您的所有 class 使用来自 Jakarta
的导入,而不是来自 Javax
.
的导入
- 将以下
<build>
添加到您的 pom.xml
:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>
- 进行这些更改后 运行
Demo.class
这应该会给您预期的 XML。 @XmlPath
也应该按预期工作。
以下是我犯的一些错误。你可以检查你是否没有制作它们:
我有太多的依赖关系,有些也是重复的。例如来自 com.sun.activation
、javax.activation
、javax.validation
、org.glassfish.jaxb
等的依赖项。其他答案中提到了这些,所以我尝试了一切。最好全部删除并重新开始,只添加一次需要的。对于这种情况,step-2
中提到的 2 个就足够了。
Whosebug
post中提到的大部分答案都是针对旧版本的。包括各种网站上的文章和博客。由于在 Java 11
之后发生了一些变化,最好使用最新版本和此答案中提到的步骤或上面 link 提供的其他答案。
确保清理并重建 maven 项目,因为有时在保存 pom.xml
文件时不会直接添加 dependencies
。至少在我使用 Intellij IDE
时是这样。每次添加依赖项时,我都在进行清理和构建,以便确保 Maven
方面一切正常。
这就是我认为足以完成这项工作的所有要点。如果您仍然遇到一些问题,请在另一个 post 或此处发表评论。如果可以的话,我会尽力回答。祝你有个愉快的一天。
我正在尝试使用 JaxB Marshalling
方法创建 XML。我想跳过某些子元素的父标签,或者可以为某个元素添加新的 XML
父标签。因此,我正在尝试使用 import org.eclipse.persistence.oxm.annotations.XmlPath;
.
@XmlPath
我正在关注创始人 (Blog on @XmlPath) 的博客以使其正常工作,但由于某种原因,@XmlPath
没有影响并且输出 XML 不匹配显示在博客中。我遵循了博客中提到的所有过程,也提到了这里的各种答案。
我所有的 classes 都在 model.jaxb
包中。此外,我在该包中创建了一个 jaxb.properties
文件。
以下是我的Customer
class:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@Getter
@Setter
@NoArgsConstructor
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
@XmlPath("contact-info/billing-address")
private Address billingAddress;
@XmlPath("contact-info/shipping-address")
private Address shippingAddress;
}
以下是我的Address
class:
@Getter
@Setter
@NoArgsConstructor
public class Address {
private String street;
}
以下是Demo
class:
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Customer customer = new Customer();
Address billingAddress = new Address();
billingAddress.setStreet("1 Billing Street");
customer.setBillingAddress(billingAddress);
Address shippingAddress = new Address();
shippingAddress.setStreet("2 Shipping Road");
customer.setShippingAddress(shippingAddress);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(customer, System.out);
}
}
我得到的XML和没有@XmlPath
其实是一样的。所以似乎 @XmlPath
在编组期间没有影响。
<customer>
<billingAddress>
<street>1 Billing Street</street>
</billingAddress>
<shippingAddress>
<street>2 Shipping Road</street>
</shippingAddress>
</customer>
我在 package model.jaxb
中创建了 jaxb.properties
文件,内容为:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
根据博客,输出 XML 应该是这样的:
<customer>
<contact-info>
<billing-address>
<street>1 Billing Street</street>
</billing-address>
<shipping-address>
<street>2 Shipping Road</street>
</shipping-address>
</contact-info>
<customer>
我不确定我做错了什么导致我无法获得我期望的 XML。我尝试了很多东西,但 none 成功了,所以在这里发布相同的东西。
有人可以帮我解决如何在编组期间踢 @XmlPath
以便在编组期间获得预期的标签吗?
**** 已编辑 *****
我正在根据 Intellij IDE File -> Project Structure
使用 Java 版本 15.0.01。我看到一个答案,其中提到 Moxy
在 Java 11
Answer Java 11.0 above.
所以我做了以下事情:
- 我添加了上述答案中提到的依赖项和
build
,所以我的pom.xml
看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>model.jaxb</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>model-jaxb</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
<version>1.2.0</version>
</dependency>
<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>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
</project>
当我 运行 程序然后我得到错误:
Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/xml/bind/JAXBException
Caused by: java.lang.ClassNotFoundException: jakarta.xml.bind.JAXBException
我尝试了很多 Whosebug for this error and most of the answers mentioned adding the
dependency 中提到的东西` 我已经添加了答案中提到的所有依赖项。我不确定出了什么问题。
有人可以帮我解决这个问题吗?
在@andrewjames 的大力帮助下,终于找到了解决方案。发布相同的解决方案,以便有人可以快速找到解决方案,而不会像我一样花费一整天:)
您也可以按照@andrewjames in his answer提到的步骤进行操作。
确保在与域 class 相同的包中只有
jaxb.properties
文件的一个副本(在这种情况下将在编组期间使用的副本Customer.class
)。文件内容应为:jakarta.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
2.Remove 来自 pom.xml
文件的所有依赖项,只需添加以下 2 个依赖项:
<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>
- 确保所有 classes(在本例中为
Customer.class
和Demo.ckass
)都使用来自import jakarta.xml.bind.JAXBContext;
. 的导入
之前取自 import javax.xml.bind.JAXBContext;
应该取自 import jakarta.xml.bind.JAXBContext;
。
我正在对 Demo.class
进行更改,但忘记在 Customer.class
中进行更改,所以看到了一些 defclass
问题。因此,请确保您的所有 class 使用来自 Jakarta
的导入,而不是来自 Javax
.
- 将以下
<build>
添加到您的pom.xml
:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>
- 进行这些更改后 运行
Demo.class
这应该会给您预期的 XML。@XmlPath
也应该按预期工作。
以下是我犯的一些错误。你可以检查你是否没有制作它们:
我有太多的依赖关系,有些也是重复的。例如来自
com.sun.activation
、javax.activation
、javax.validation
、org.glassfish.jaxb
等的依赖项。其他答案中提到了这些,所以我尝试了一切。最好全部删除并重新开始,只添加一次需要的。对于这种情况,step-2
中提到的 2 个就足够了。Whosebug
post中提到的大部分答案都是针对旧版本的。包括各种网站上的文章和博客。由于在Java 11
之后发生了一些变化,最好使用最新版本和此答案中提到的步骤或上面 link 提供的其他答案。确保清理并重建 maven 项目,因为有时在保存
pom.xml
文件时不会直接添加dependencies
。至少在我使用Intellij IDE
时是这样。每次添加依赖项时,我都在进行清理和构建,以便确保Maven
方面一切正常。
这就是我认为足以完成这项工作的所有要点。如果您仍然遇到一些问题,请在另一个 post 或此处发表评论。如果可以的话,我会尽力回答。祝你有个愉快的一天。