@XmlElement具有多个名称
我在这里遇到一种情况,试图充当两个API之间的网关。我需要做的是:
- 向APIa提出请求;
- 将XML响应解析(编组)为java对象;
- 对其进行很少的更改;
- 然后以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)。在您的用例中,ResponseCode
和ResultCode
元素都对应于type
String
,解组总是可以正常工作,但是要输出哪个元素是任意的。一些JAXB Impls可能有最后指定的获胜者,但其他人可能很容易获得第一个获胜者。
您可以利用进行以下操作@XmlElementRef
。
回答:
我们将responseCode
属性从type
更改String
为JAXBElement<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