Я пытаюсь создать XML, используя подход JaxB Marshalling
. Я хочу пропустить родительский тег для определенных дочерних элементов или могу добавить новый родительский тег XML
для определенного элемента. Следовательно, я пытаюсь использовать @XmlPath
от import org.eclipse.persistence.oxm.annotations.XmlPath;
.
Я слежу за блогом основателя (блог на @XmlPath), чтобы заставить его работать, но по какой-то причине @XmlPath
не влияет, и выходной XML не совпадает с тем, что показано в блоге. Я следил за всем процессом, упомянутым в блоге, а также упоминал здесь в различных ответах.
Все мои классы входят в пакет model.jaxb
. Кроме того, я создал файл jaxb.properties
в этом пакете.
Ниже приведен мой Customer
класс:
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
класс:
@Getter
@Setter
@NoArgsConstructor
public class Address {
private String street;
}
Ниже приводится класс Demo
:
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>
Я создал jaxb.properties
файл в моем package model.jaxb
с содержанием:
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, как ожидал. Я много чего пробовал, но ни один из них не работал, поэтому разместил здесь то же самое.
Может ли кто-нибудь помочь мне с тем, как я могу сделать @XmlPath
пинок во время маршаллинга, чтобы я мог получить ожидаемый тег во время маршаллинга?
**** РЕДАКТИРОВАТЬ *****
Я использую версию Java 15.0.01 согласно Intellij IDE File -> Project Structure
. Я видел один ответ, в котором упоминалось, что Moxy
не работает непосредственно выше Java 11
Ответ Java 11.0 выше.
Итак, я сделал следующее:
- Я добавил зависимость и
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
Я пробовал много вещей, упомянутых в StackOverflow for this error and most of the answers mentioned adding the
dependency` Я добавил все зависимости, упомянутые в ответе. Я не уверен, что не так.
Может ли кто-нибудь помочь мне решить эту проблему?
pom.xml
файле этап сборки, который обеспечивает включениеjaxb.properties
файла в JAR (или WAR), созданный Maven? - person andrewjames   schedule 12.05.2021jaxb.properties
файл в папкуresources->model->jaxb
той же структуры, что и мойdomain classes which will be used by jaxb
, после этого я добавил зависимость, упомянутую в вашем ответе, и еще две зависимости, такие какorg.glassfish.jaxb
иjakarta.xml.bind
. Теперь он выдает мне ошибкуException in thread "main" java.lang.NoClassDefFoundError: jakarta/xml/bind/JAXBContext
- person BATMAN_2008   schedule 12.05.2021Exception in thread "main" java.lang.NoClassDefFo undError: jakarta/xml/bind/JAXBContext
проблему. Я изменил вопрос на основании этой проблемы. Не могли бы вы взглянуть на разделedited
в этом вопросе и высказать свое мнение? - person BATMAN_2008   schedule 12.05.2021resources
. Он должен находиться в том же месте, что и ваши исходные файлы Java, а именно в пакетеmodel.jaxb
. Создание копии этой структуры каталогов вresources
- совсем другое дело. Ваша команда Mavenbuild
гарантирует, что файл свойств будет скопирован в то же целевое расположение, что и ваши скомпилированныеclass
файлы. Вы можете открыть файл JAR, чтобы убедиться, что он оказался в нужном месте. - person andrewjames   schedule 12.05.2021Java Classes
и папкуresources
, просто чтобы посмотреть, будет ли это иметь значение. Теперь после вашего комментария я удалил файл из папкиResources
. Так что теперь он просто присутствует в том же пакете, что и мойjava classes
. Это предоставляет мне XML, но XML не принимает во внимание элементы@XmlPath
. С@XmlPath
или без него он производит тот же XML, поэтому я не уверен, что здесь не так. Потому что вы использовали тот же код, и он работает для вас, но по какой-то причине он не работает для меня. Что я могу попробовать? - person BATMAN_2008   schedule 12.05.2021jaxb.properties
из папкиresources
. В большинстве ответов упоминается, что ошибка связана с отсутствиемdependency
. Я добавил все необходимые зависимости, но все равно получаю сообщение об ошибке:Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/xml/bind/JAXBException
- person BATMAN_2008   schedule 12.05.2021jakarta.xml.bind
в зависимостях? - person andrewjames   schedule 12.05.2021jakarta.xml.bind
иorg.glassfish.jaxb
. Для Java 11 и выше они говорят, что нам нужно использовать эту зависимость. Если я удалю это, я также получаю ошибки. Если я добавлю, то тоже получаю ошибки. Я очень не понимаю, что нужно делать. Удалить оба или только одинjakarta.xml.bind
? Вот ссылка на то, что я имел в виду: stackoverflow.com/a/43574427/7584240 - person BATMAN_2008   schedule 12.05.2021<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency>
и<dependency><groupId>org.eclipse.persistence</groupId><artifactId>eclipselink</artifactId><version>2.7.6</version></dependency>
. Расскажи мне, что происходит. - person andrewjames   schedule 12.05.2021Demo.class
, который имеетJaxBContent
. Я получаю следующую ошибку:Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/xml/bind/JAXBException
после нескольких строк ошибки у меня тоже есть эта строкаCaused by: java.lang.ClassNotFoundException: jakarta.xml.bind.JAXBException
- person BATMAN_2008   schedule 12.05.2021jaxb.properties
доjakarta
(заменил старую строку на новую). 2. Добавлены новые зависимости вpom.xml
с версией 3.0.0 (удалены старые и сохранены новые зависимости). 3. Изменил импорт вDemo.class
наjakarta
сjaxb
. когда я бегу, я получаю следующую ошибку:Exception in thread "main" javax.xml.bind.JAXBException: jaxb.properties in package (link to package) does not contain the javax.xml.bind.JAXBContextFactory property.
- person BATMAN_2008   schedule 12.05.2021Customer.class
все еще использовалimports
изjaxb
вместоJakarta
. Я снова все это анализировал, нашел это. Я изменил весь импорт наJakarta
, и все заработало, и я смог получитьXML
, как я ожидал. Кроме того,@XmlPath
работает должным образом. - person BATMAN_2008   schedule 12.05.2021. Now what if I want to skip the
‹street›` тег с помощью тега@XmlPath
? Я попытался добавить следующие@XmlPath(".")
и@XmlPath("./text()")
, но оба выдают ошибку. Я хочу добавить значениеstreet
непосредственно к<billing-address>
, чтобы можно было пропустить тег<street>
. Я планировал использовать@XmlPath
именно по этой основной причине. Можно ли использовать@XmlPath
? Спасибо - person BATMAN_2008   schedule 13.05.2021@XmlAccessorType(XmlAccessType.FIELD)
в свойAddress.class
, и это сработало, поэтому теперь тегstreet
напрямую сопоставлен с тегомcustomer
, аbilling-address
был пропущен. - person BATMAN_2008   schedule 13.05.2021