Повторное использование классов JAXB из другого пакета в пространстве имен - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь повторно использовать эти вложенные классы JAXB в разных пространствах имен в разных пакетах.

packageA.MetaData. java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "data"
})
@XmlRootElement(name = "metadata")
public class MetaData {

    @XmlElement(required = false)
    protected Set<Data> data = new HashSet();
}

packageA.Data. java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "data"
})
@XmlRootElement(name = "data")
public class Data {

    @XmlAttribute(name="name")
    protected String name = "";

    @XmlElement(required=false)
    protected Set<Data> data = new HashSet();
}

packageA не имеет информации о пакете. java и я хочу использовать их для объектов в другом пакете

Профиль packageB. java

import packageA.MetaData;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "metadata"
})
@XmlRootElement(name = "Profile")
public class Profile {

    @XmlElement(required = false)
    protected MetaData metadata;
}

packageB.package-info. java

@javax.xml.bind.annotation.XmlSchema(namespace = "http://packageB.Profile", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package packageB.Profile;

Я пытаюсь упорядочить объект профиля в System.Out

import packageA.MetaData;
import packageA.Data;

Profile profile = new Profile();
Data data = new Data();
data.setName("Type");
data.setValue("A");
MetaData metadata = new MetaData();
metadata.addData(data);
profile.setMetadata(metadata);

JAXBContext jaxbContext = JAXBContext.newInstance(Profile.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
jaxbMarshaller.marshal(employee, System.Out);

EXPECTED

<Profile xmlns="http://packageB.Profile">
    <metadata>
        <data name="Type" value="A"/>
    <metadata>
</Profile>

ACTUAL

<ns2:Profile xmlns:ns2="http://packageB.Profile">
    <ns2:metadata>
        <data name="Type" value="A"/>
    </ns2:metadata>
</ns2:Profile>

Я полагаю, что он добавляет ns2 только к тем элементам, которые находятся в пакете имен B.Profile

Если я копирую и вставляю метаданные. java и Data. java классы в packageB , перекомпилируйте, затем попытайтесь выполнить маршализацию, я получаю ожидаемый вывод.

Каков наилучший способ импорта метаданных. java и данных. java из пакета A, который должен находиться в пространстве имен в пакете B?

...