Вам не нужно писать собственный адаптер для различных типов профилей в вашем ProfileSet
.
Вместо этого для обработки такого смешанного содержимого XML канонический подход выглядит следующим образом.
В вашем ProfileSet
классе вы должны определить полиморфное свойство Java profile
, которое может принимать содержимое элементов <organization.information-profile>
, <connection-profile>
или <user-information-profile>
.(Я предпочел здесь имя profile
вместо innerPayload
).Сопоставление этих имен элементов XML и классов Java выполняется с помощью аннотации @XmlElements
.
@XmlAccessorType(XmlAccessType.FIELD)
public class ProfileSet {
@XmlElement(name = "name")
private String name;
// template to store different profile objects
@XmlElements({
@XmlElement(name = "organization-information-profile", type = OrganizationInfomationProfile.class),
@XmlElement(name = "connection-profile", type = ConnectionProfile.class),
@XmlElement(name = "user-information-profile", type = UserInformationProfile.class)
})
private Profile profile;
// default constructor used by JAXB unmarshaller
public ProfileSet() {
}
public ProfileSet(String name, Profile profile) {
this.name = name;
this.profile = profile;
}
}
Вам необходим абстрактный суперкласс Profile
, содержащий только общие свойствадля всех видов профилей:
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class Profile {
@XmlElement
private String name;
@XmlElement(name = "attribute")
private List<Attribute> attributes;
}
У вас есть один подкласс OrganizationInformationProfile
для представления элемента <organization-information-profile>
@XmlAccessorType(XmlAccessType.FIELD)
public class OrganizationInfomationProfile extends Profile {
@XmlElement(name = "qualified-name")
private String qualifiedName;
@XmlElement(name = "last-name")
private String lastName;
@XmlElement(name = "address")
private String address;
// ... other properties
}
и другой подкласс ConnectionProfile
для представления <connection-profile>
element
@XmlAccessorType(XmlAccessType.FIELD)
public class ConnectionProfile extends Profile {
@XmlElement(name = "service")
private Service service;
}
и еще один подкласс UserInformationProfile
для представления элемента <user-information-profile>
.
Используя вышеупомянутый подход, вы можете разархивировать ваши примеры XML и снова получить тот же вывод при маршалинге,