我试图用JAXB返回一个xml响应,实现看起来像下面的例子。我的问题是:有没有一种方法可以返回整个xml,而无需在字段上设置值?
@ResponsePayload
public JAXBElement<Ns2AnfrageBonitaetsauskunftAntwortType> getResponse(@RequestPayload JAXBElement<Ns2AnfrageBonitaetsauskunftTyp> request) {
Ns2AnfrageBonitaetsauskunftAntwortType response = new Ns2AnfrageBonitaetsauskunftAntwortType();
response.setSchufaReferenz("test2");
response.setTeilnehmerreferenz("test1");
response.setAktionsdaten("test3");
Ns3BonitaetsauskunftType bonita = new Ns3BonitaetsauskunftType();
bonita.setTeilnehmerkennung("test4");
Ns3VerarbeitungsinformationType verar = new Ns3VerarbeitungsinformationType();
verar.setErgebnistyp("test7");
bonita.setVerarbeitungsinformation(verar);
Ns3VerbraucherdatenAuskunftType daten = new Ns3VerbraucherdatenAuskunftType();
daten.setPersonOhneGeburtsdatum("test6");
bonita.setVerbraucherdaten(daten);
response.setReaktion(bonita);
ObjectFactory objectFactory = new ObjectFactory();
return objectFactory.createBonitaetsauskunft(response);
}
此刻响应如下:
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header/>
<env:Body>
<ns3:Bonitaetsauskunft xmlns:ns3="http://ifd-schema.de/BonitaetsauskunftSCHUFA">
<SchufaReferenz>test2</SchufaReferenz>
<Teilnehmerreferenz>test1</Teilnehmerreferenz>
<Aktionsdaten xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">test3</Aktionsdaten>
<Reaktion>
<Teilnehmerkennung>test4</Teilnehmerkennung>
<Verbraucherdaten>
<PersonOhneGeburtsdatum>test6</PersonOhneGeburtsdatum>
</Verbraucherdaten>
<Verarbeitungsinformation>
<Ergebnistyp>test7</Ergebnistyp>
</Verarbeitungsinformation>
</Reaktion>
</ns3:Bonitaetsauskunft>
</env:Body>
</env:Envelope>
我还有更多字段,我不想在该字段上设置值,但我希望它们出现在响应中。有任何想法吗?
谢谢
答案 0 :(得分:0)
您可以使用nillable
注释将属性添加到每个属性@XmlElement(nillable = true)
。来自documentation:
可选。指定是否可以将明确的null值分配给 元素。 True使元素的实例具有null 属性设置为true。 null属性被定义为 实例的XML模式名称空间。默认为false
具有此属性的字段将打印为<value xsi:nil="true"/>
。小例子:
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
public class JaxbApp {
public static void main(String[] args) throws Exception {
Root dataFile = new Root();
dataFile.setPerson(new Person());
JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
marshaller.marshal(dataFile, System.out);
}
}
@XmlRootElement(name = "roo")
@XmlAccessorType(XmlAccessType.FIELD)
class Root {
@XmlElement(nillable = true)
private Integer id;
@XmlElement(nillable = true)
private String value;
@XmlElement(nillable = true)
private Person person;
// getters, setters, toString
}
@XmlAccessorType(XmlAccessType.FIELD)
class Person {
@XmlElement(nillable = true)
private String name;
@XmlElement(nillable = true)
private String lastName;
// getters, setters, toString
}
打印:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<roo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">
<id xsi:nil="true"/>
<value xsi:nil="true"/>
<person>
<name xsi:nil="true"/>
<lastName xsi:nil="true"/>
</person>
</roo>
在这种情况下,您需要更改XSD
/ WSDL
文档,并将此属性添加到每个基本字段。当然,在上面的示例中,您仍然需要创建新的POJO
实例,例如new Person()
。当然,您可以将类中的每个属性设置为某种默认值private String value = "";
,也可以编写遍历所有属性并设置为某些自定义值的反射工具。
另请参阅: