Я есть поле в моемСотруднике.класс, которое является 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;
}
Код: Выделить всё
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;
}
}
Код: Выделить всё
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
Код: Выделить всё
one
two
three
Подробнее здесь: https://stackoverflow.com/questions/790 ... ring-the-c
Мобильная версия