@XmlElement具有多个名称

我在这里遇到一种情况,试图充当两个API之间的网关。我需要做的是:

  1. 向APIa提出请求;
  2. 将XML响应解析(编组)为java对象;
  3. 对其进行很少的更改;
  4. 然后以XML(解组)形式向另一端(APIb)做出响应。

事实是,我使用同一对象来解析API响应并将响应发送到另一端。

public class ResponseAPI{

@XmlElement(name="ResponseCode") //I receive <ResponseCode> but I need to send <ResultCode>

private String responseCode;

//getter and setter

}

正如评论所说:我收到但我需要发送

有没有一种方法可以完成此操作而不必创建另一个带有ResultCode的额外类?

提前致谢!

回答:

Ilya给出的答案有效,但不能保证在所有JAXB实现中甚至在单个JAXB实现的版本中都有效。@XmlElements当决定要编组哪个元素取决于值的类型时,该注释很有用(请参阅:http : //blog.bdoughan.com/2010/10/jaxb-and-xsd-

choice-xmlelements.html)。在您的用例中,ResponseCodeResultCode元素都对应于type

String,解组总是可以正常工作,但是要输出哪个元素是任意的。一些JAXB Impls可能有最后指定的获胜者,但其他人可能很容易获得第一个获胜者。


您可以利用进行以下操作@XmlElementRef

回答:

我们将responseCode属性从type

更改StringJAXBElement<String>。将JAXBElement允许我们存储元素名称和值。

import javax.xml.bind.JAXBElement;

import javax.xml.bind.annotation.*;

@XmlRootElement

@XmlAccessorType(XmlAccessType.FIELD)

public class ResponseAPI{

@XmlElementRefs({

@XmlElementRef(name = "ResponseCode"),

@XmlElementRef(name = "ResultCode")

})

private JAXBElement<String> responseCode;

public JAXBElement<String> getResponseCode() {

return responseCode;

}

public void setResponseCode(JAXBElement<String> responseCode) {

this.responseCode = responseCode;

}

}

@XmlElementRef我们在ResponseAPI类中使用的注释对应于用@XmlElementDecl注释的类的注释@XmlRegistry。传统上称为此类,ObjectFactory但您可以根据需要调用它。

import javax.xml.bind.JAXBElement;

import javax.xml.bind.annotation.*;

import javax.xml.namespace.QName;

@XmlRegistry

public class ObjectFactory {

@XmlElementDecl(name="ResponseCode")

public JAXBElement<String> createResponseCode(String string) {

return new JAXBElement<String>(new QName("ResponseCode"), String.class, string);

}

@XmlElementDecl(name="ResultCode")

public JAXBElement<String> createResultCode(String string) {

return new JAXBElement<String>(new QName("ResultCode"), String.class, string);

}

}

回答:

<responseAPI>

<ResponseCode>ABC</ResponseCode>

</responseAPI>

创建时,JAXBContext我们需要确保我们包括包含@XmlElementDecl批注的类。

import java.io.File;

import javax.xml.bind.*;

public class Demo {

public static void main(String[] args) throws Exception {

JAXBContext jc = JAXBContext.newInstance(ResponseAPI.class, ObjectFactory.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();

File xml = new File("Scratch/src2/forum24554789/input.xml");

ResponseAPI responseAPI = (ResponseAPI) unmarshaller.unmarshal(xml);

ObjectFactory objectFactory = new ObjectFactory();

String responseCode = responseAPI.getResponseCode().getValue();

JAXBElement<String> resultCodeJAXBElement = objectFactory.createResultCode(responseCode);

responseAPI.setResponseCode(resultCodeJAXBElement);

Marshaller marshaller = jc.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

marshaller.marshal(responseAPI, System.out);

}

}

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<responseAPI>

<ResultCode>ABC</ResultCode>

</responseAPI>

以上是 @XmlElement具有多个名称 的全部内容, 来源链接: utcz.com/qa/417976.html

回到顶部