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

如何使用JAXB从服务返回的“ anyType”中创建Java对象?

方长卿
2023-03-14
问题内容

Web服务正在返回由WSDL定义的对象,该对象为:

<s:complexType mixed="true"><s:sequence><s:any/></s:sequence></s:complexType>

当我打印出该对象的类信息时,它显示为:

class com.sun.org.apache.xerces.internal.dom.ElementNSImpl

但我需要将此对象解组为以下类的对象:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = {
        "info",
        "availability",
        "rateDetails",
        "reservation",
        "cancellation",
        "error" }) 
@XmlRootElement(name = "ArnResponse") 
public class ArnResponse { }

我知道响应是正确的,因为我知道如何编组此对象的XML:

Marshaller m = jc.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
m.marshal(rootResponse, System.out);

打印出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:SubmitRequestDocResponse xmlns:ns2="http://tripauthority.com/hotel">
    <ns2:SubmitRequestDocResult>
        <!-- below is the object I'm trying to unmarshall -->
        <ArnResponse>
            <Info />
            <Availability>
                <!-- etc--> 
             </Availability>
        </ArnResponse>
    </ns2:SubmitRequestDocResult>
</ns2:SubmitRequestDocResponse>

如何将ElementNSImpl看到的ArnResponse对象变成我知道的对象?

此外,我在AppEngine上运行,该文件访问受到限制。

谢谢你的帮助

更新

我添加了@XmlAnyElement(lax=true)注释,如下所示:

  @XmlAccessorType(XmlAccessType.FIELD)
  @XmlType(name = "", propOrder = {
      "content"
  })
  @XmlSeeAlso(ArnResponse.class)
  public static class SubmitRequestDocResult {

    @XmlMixed
    @XmlAnyElement(lax = true)
    protected List<Object> content;

但这没有任何区别。

这与内容是的事实有关List吗?

这是从服务器取回内容后要尝试访问的代码:

List list = rootResponse.getSubmitRequestDocResult().getContent();

for (Object o : list) {
  ArnResponse response = (ArnResponse) o;
  System.out.println(response);
}

具有以下输出:

2012年1月31日,上午10:04:14 com.districthp.core.server.ws.alliance.AllianceApi
getRates严重:com.sun.org.apache.xerces.internal.dom.ElementNSImpl无法转换为com.districthp.core
.server.ws.alliance.response.ArnResponse

回答:

axtavt的答案就解决了。这工作:

Object content = ((List)result.getContent()).get(0);
JAXBContext context = JAXBContext.newInstance(ArnResponse.class);
Unmarshaller um = context.createUnmarshaller();
ArnResponse response = (ArnResponse)um.unmarshal((Node)content);
System.out.println("response: " + response);

问题答案:

您可以将该对象传递给Unmarshaller.unmarshal(Node),它应该可以将其解组。



 类似资料:
  • 问题内容: 我试图遵守MVC惯例,并将所有网络代码保留在我的应用程序中使用的数据服务类中。在一个屏幕上,我有需要显示的用户名和用户名。更新此函数时,我正在调用此函数: 但是尝试返回用户时出现错误!它说: void函数中非预期的非无效返回值。 但是该功能显然不是无效的。那我该怎么办? 问题答案: 您正在将 函数 返回值与Firebase 闭包 返回值混淆-前者是但后者是;) 您实际上是从此关闭返回的

  • 我有一个运行Equinox框架的类。现在我想获取一个对象(在其中一个bundle中定义),该对象由框架外的服务返回。 不幸的是,我得到了一个LinkageError,不知道如何摆脱它。甚至可以让服务向非捆绑代码返回适当的对象吗? 以下是完整的故事: ParserDTOBundle是一个包,它定义了类ParserDTO并导出了相应的包。 在另一个包ParserServiceBundle中,我定义了一

  • 我正在为我的REST Web服务使用Spring@RESTController。我尝试在rest方法中返回ResponseEntity对象的对象,而不是返回ModelAndView的对象。对于Strgin类型的响应,当我用一个Jaxbobject构建ResponseEntity时,它会给出HTTP错误406 下面不起作用

  • 问题内容: 早上, 我需要从Web服务返回一条消息。以下是我的代码示例,我正在返回一个字符串。 我目前收到以下回应… 我理想上想返回类似 我敢肯定,一旦我有了主意,就可以在需要时退还其他物品。这只是我需要解决的基础。 非常感谢所有帮助,在此先感谢:) 更新:刚发现这个… 我需要类似的东西吗 问题答案: 用: 返回的结果将类似于:

  • 我需要从现有的WSDL文件为使用OCPP协议的系统创建一个中心系统(SOAP服务器)。(开放充电桩协议) 我已经成功地在非wsdl模式和wsdl模式下编写了测试SOAP服务器和客户机,但是当我尝试使用现有的wsdl时,我得到的只是一堆错误(这并不能告诉我太多) 可以在此处找到WSDL文件(中央系统和chargepoint。抱歉,无法发布更多链接..) 我已经修复了一些错误,但是不能越过这个。 我想

  • 问题内容: 我刚刚继承了一个Java应用程序,该应用程序需要作为服务安装在XP和Vista上。自从我以任何形式使用Windows至今已有8年了,而且我从未创建过一项服务,更不用说从Java应用程序之类的东西了了(我为该应用程序提供了一个jar,并且有一个依赖项jar-log4j )。使它作为服务运行所需的魔术是什么?我已经掌握了源代码,因此尽管可以避免进行代码修改,但还是可以的。 问题答案: 我对