Здравствуйте, пожалуйста, приложите xml-файл к нему из одних и тех же элементов, элементы отличаются содержанием атрибута «name». Эти элементы имеют разные наборы элементов, как выполнять немаршалирование? Xml:Unmarshalling xml с jaxb, если элементы одинаковые, но разные значения элементов
<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>
<service-broker>
<adapters>
<adapter name=\"cdb\">
<protocol>JDBC</protocol>
<datasource>CdbAdapterDS</datasource>
</adapter>
<adapter name=\"fmss-sc\">
<protocol>BBBC</protocol>
<fleet-uc18-reason-codes>
<code>2</code>
<code>3</code>
</fleet-uc18-reason-codes>
</adapter>
</adapters>
</service-broker>
Мне нужно выполнить демаршаллинг объекта 2 в CDB и FmssSc Мои попытки: Генеральный элемент - ServiceBroker.class
package jax;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "service-broker")
@XmlAccessorType(XmlAccessType.FIELD)
public class ServiceBroker {
@XmlElement(name = "adapters")
private Adapters adapters;
public Adapters getAdapters() {
return adapters;
}
public void setAdapters(Adapters adapters) {
this.adapters = adapters;
}
}
Adapters.class
package jax;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
@XmlAccessorType(XmlAccessType.FIELD)
class Adapters {
@XmlElement
private Cdb cdb;
@XmlElement
private FmssSc fmssSc;
public Cdb getCdb() {
return cdb;
}
public void setCdb(Cdb cdb) {
this.cdb = cdb;
}
public FmssSc getFmssSc() {
return fmssSc;
}
public void setFmssSc(FmssSc fmssSc) {
this.fmssSc = fmssSc;
}
}
Cdb.class
package jax;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@XmlAccessorType(XmlAccessType.FIELD)
class Cdb {
@XmlElement(name = "protocol")
private String protocol;
@XmlElement(name = "datasource")
private String datasource;
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getDatasource() {
return datasource;
}
public void setDatasource(String datasource) {
this.datasource = datasource;
}
}
FmssSc.class
package jax;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
@XmlAccessorType(XmlAccessType.FIELD)
class FmssSc {
@XmlElement(name = "protocol")
private String protocol;
@XmlElementWrapper(name = "fleet-uc18-reason-codes")
@XmlElement(name = "code")
private List<String> code = new ArrayList<>();
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public List<String> getCode() {
return code;
}
public void setCode(List<String> code) {
this.code = code;
}
}
Демо:
package jax;
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
public class Jax {
public static final String adapter =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<service-broker>" +
"<adapters>" +
"<adapter name=\"cdb\">" +
"<protocol>JDBC</protocol>" +
"<datasource>CdbAdapterDS</datasource>" +
"</adapter>" +
"<adapter name=\"fmss-sc\">" +
"<protocol>BBBC</protocol>" +
"<fleet-uc18-reason-codes>" +
"<code>2</code>" +
"<code>3</code>" +
"</fleet-uc18-reason-codes>" +
"</adapter>" +
"</adapters>" +
"</service-broker>";
public static void main(String[] args) throws JAXBException {
Jax jax = new Jax();
jax.shouldUnmarshallAdapter();
}
public void shouldUnmarshallAdapter() throws JAXBException {
StringReader reader = new StringReader(adapter);
JAXBContext context = JAXBContext.newInstance(ServiceBroker.class);
Unmarshaller u = context.createUnmarshaller();
ServiceBroker sb = (ServiceBroker) u.unmarshal(reader);
System.out.println(sb.getAdapters().getCdb().getProtocol());
}
}
Ошибка:
Exception in thread "main" java.lang.NullPointerException
at jax.Jax.shouldUnmarshallAdapter(Jax.java:39)
at jax.Jax.main(Jax.java:31)
Возможного дубликат [JAXB - немаршалинг полиморфных объектов] (http://stackoverflow.com/q/5491982/5221149) или [Java/JAXB: маршализация Xml для конкретного подкласса на основе атрибута] (http://stackoverflow.com/q/2992234/5221149). Дополнительные сведения см. В разделе google ['jaxb unmarshal subclass from attribute'] (https://www.google.com/#q=jaxb+unmarshal+subclass+from+attribute). – Andreas