У меня есть pojo, который я сериализую, используя com.fasterxml.jackson.dataformat.xml.XmlMapper.
У меня есть класс Java, определенный со значениями нескольких строк.
@JacksonXmlRootElement(namespace = "http://www.firstnamespace.com", localName = "Student")
public class Student {
@JacksonXmlProperty(namespace = "http://www.firstnamespace.com",localName = "ID")
public final String id;
@JacksonXmlProperty(namespace = "http://www.firstnamespace.com",localName = "Name")
public final String name;
@JacksonXmlProperty(namespace = "http://www.firstnamespace.com",localName = "Address")
public Address address;
}
Адрес определяется как это, и элементы адреса находятся в другом пространстве имен
public class Address {
@JacksonXmlProperty(namespace = "http://www.secondnamespace.com",localName = "StreetNumber")
public final String streetNumber;
@JacksonXmlProperty(namespace = "http://www.secondnamespace.com",localName = "StreetName")
public final String steetName;
}
Когда я сериализую Студента с Джексоном, я получаю кучу повторяющихся пространств имен для объекта адреса.
<Student xmlns="http://www.firstnamespace.com">
<ID>1234</ID>
<Name>Ken</Name>
<Address>
<wstxns1:StreetNumber xmlns:wstnxs1="http://www.secondnamespace.com">Ken</wstxns1:StreetNumber>
<wstxns2:StreetName xmlns:wstnxs2="http://www.secondnamespace.com">Main Street</wstxns2:StreetName>
</Address>
Я сериализирую ученический класс следующим образом:
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
xmlMapper.writeValue(new File("studentTest.xml", student);
File file = new File("studentTest.xml");
Есть ли способ сделать один префикс пространства имен для данного пространства имен?
<Student xmlns="http://www.firstnamespace.com">
<ID>1234</ID>
<Name>Ken</Name>
<Address>
<wstxns1:StreetNumber xmlns:wstnxs1="http://www.secondnamespace.com">Ken</wstxns1:StreetNumber>
<wstxns1:StreetName>Main Street</wstxns1:StreetName>
</Address>
Или определить пространства имен вверху?
<Student xmlns="http://www.firstnamespace.com" xmlns:wstnxs1="http://www.secondnamespace.com">
<ID>1234</ID>
<Name>Ken</Name>
<Address>
<wstxns1:StreetNumber>Ken</wstxns1:StreetNumber>
<wstxns1:StreetName>Main Street</wstxns1:StreetName>
</Address>
Я прочитал, что мне нужно использовать Woodstox для решения этой проблемы, и я попробовал следующее, но я не вижу, как конфигурация Woodstox помогает это исправить. Однако я смог изменить префикс:
XMLInputFactory2 inputFactory2 = new WstxInputFactory();
XMLOutputFactory2 outputFactory2 = new WstxOutputFactory();
outputFactory2.setProperty(XMLOutputFactory2.P_AUTOMATIC_NS_PREFIX,"foo");
outputFactory2.configureForRobustness();
XmlFactory xmlFactory = new XmlFactory(inputFactory2,outputFactory2);
XmlMapper xmlMapper = new XmlMapper(xmlFactory);