Маршалинг JAXB позволяет избежать добавления дополнительной оболочки во время пользовательского XmlAdapter.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Маршалинг JAXB позволяет избежать добавления дополнительной оболочки во время пользовательского XmlAdapter.

Сообщение Anonymous »

У меня есть простая программа Java, которая преобразует мой объект Java в XML. Он работает нормально, но единственная проблема заключается в том, что во время маршалинга List он добавляет дополнительный , который мне не нужен.
Я есть поле в моемСотруднике.класс, которое является Object, и оно может быть либо String, либо List, поэтому для поля Jakarta/JAXB marshall Я использую свой собственный XMLAdapter, и для простой строки он работает нормально, но для List добавляется , который мне не нужен.
Ниже приведен мой код для Student.class:

Код: Выделить всё

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable {
@XmlJavaTypeAdapter(CustomNameAdapter.class)
private Object name;
}
Ниже приведен мой собственный XML-адаптер CustomNameAdapter.class:

Код: Выделить всё

import jakarta.xml.bind.annotation.adapters.XmlAdapter;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilderFactory;
import java.util.List;

public class CustomNameAdapter extends XmlAdapter {
@Override
public Object unmarshal(Object v) {
return null;
}

//During the writing of XML handle either simple String or List and write name field
@Override
public Object marshal(Object name) throws Exception {
System.out.println("Obtained Name Values : " + name);
final Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

if (name instanceof String) {
final Element root = document.createElement("name");
root.setTextContent((String) name);
return root;
} else if (name instanceof List) {
final List infoList = (List) name;
final Element root = document.createElement("name");

for (final String item : infoList) {
final Element element = document.createElement("name");
element.setTextContent(item);
root.appendChild(element);
}
return root;
}
return null;
}
}
Ниже приведен мой основной метод MarshallerMain.class:

Код: Выделить всё

import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;

import java.util.ArrayList;
import java.util.List;

public class MarshallerMain {
public static void main(String[] args) throws JAXBException {
final Employee employee1 = new Employee("Name1");

final List names = new ArrayList();
names.add("one");
names.add("two");
names.add("three");

final Employee employee2 = new Employee(names);

final JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class);
final Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

System.out.println("Employee 1 Simple String : ");
jaxbMarshaller.marshal(employee1, System.out);

System.out.println("Employee 2 List of String : ");
jaxbMarshaller.marshal(employee2, System.out);
}
}
Ниже приведен полный результат, который я получаю:

Код: Выделить всё

Employee 1 Simple String :
Obtained Name Values : Name1


Name1

Employee 2 List of String :
Obtained Name Values : [one, two, three]



one
two
three


Но мне нужен вывод для List без дополнительной упаковки с :

Код: Выделить всё

one
two
three

Как устранить проблему во время маршалинга XML, чтобы избежать дополнительной упаковки для моего ?


Подробнее здесь: https://stackoverflow.com/questions/790 ... -custom-xm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»