当前位置: 首页 > 面试题库 >

@XmlElement具有多个名称

邵毅
2023-03-14
问题内容

我在这里遇到一种情况,试图充当两个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

Java模型

ResponseAPI

我们将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);
    }

}

示范代码

input.xml

<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>


 类似资料:
  • 我已经创建了一个类似上面的类,我希望能够使用相同的类使用'colour'作为这个类的替代,如下面。 有没有一种方法可以简单地创造出来?

  • 我使用SpringBoot创建了一个SOAP Web服务服务器,并且我能够成功创建一个endpoint。但是,我无法创建多个endpoint并使用不同的URL访问它们。我想通过URL来访问处理该过程。 每个endpoint接收到的SOAP消息具有相同的模式。(命名空间和localpart是相同的!!!)我不想公开WSDL。 例如。 userA向以下URL发送以下SOAP消息:http://soap

  • 我发送一个POST请求,从一家运输公司生成AWB。为了做到这一点,我必须通过SOAP API POST请求发布多个数据条目。下面的XML是类似的,这是必需的(我已经简化了,否则它要求超过30个参数) 我是SOAP新手,请帮助我朝着正确的方向前进,我甚至非常感谢上面的XML代码,因为它有助于更好地理解。

  • 问题内容: 我正在尝试检测具有扩展名列表的文件。 问题答案: 为此使用元组。 不必每次都转换,只需将其转换为元组一次即可。

  • 问题内容: 我的MySQL数据库中有这些表: 通用表: Facebook表: 首席表: 基本上,常规表包含一些( 显然 )常规数据。基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在某些熟悉的列中(例如,expiresAt),而在其他一些列中则不然。 我的问题是,如何仅通过一个查询就可以获取generalTable和正确的明细表的联接数据。 所以,我想这

  • 问题内容: 我探索了许多有关如何从多个列中返回最大值以及列名的问题和答案。但是我这里还没有解决问题,这个问题会解释: 多个列的SQL MAX? 但是我不知道如何找出具有最大价值的列名称?有任何想法吗? 问题答案: 您可以使用GREATEST函数在所有列中查找最大值: