JAXB-即使我没有值也返回整个XML对象

时间:2019-03-22 09:38:20

标签: java xml soap jaxb

我试图用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>

我还有更多字段,我不想在该字段上设置值,但我希望它们出现在响应中。有任何想法吗?

谢谢

1 个答案:

答案 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 = "";,也可以编写遍历所有属性并设置为某些自定义值的反射工具。

另请参阅: