首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JaxbUnmarshaller和Package-info不工作

JaxbUnmarshaller和Package-info不工作
EN

Stack Overflow用户
提问于 2014-05-27 07:02:47
回答 1查看 2K关注 0票数 1

我试图解开像这样的xml:

代码语言:javascript
复制
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:b2bHotelSOAP" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <ns1:getAvailableHotelResponse>
         <return xsi:type="ns1:getAvailableHotelResponse">
            <responseId xsi:type="xsd:integer">1</responseId>
            <searchId xsi:type="xsd:string">HR-47754204</searchId>
            <totalFound xsi:type="xsd:integer">20</totalFound>
            <availableHotels SOAP-ENC:arrayType="ns1:hotel[20]" xsi:type="ns1:hotelArray">
               ...
            </availableHotels>
          </return>
      </ns1:getAvailableHotelResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我使用这个package-info.java来指定soap响应中使用的名称空间:

代码语言:javascript
复制
@XmlSchema(
    namespace="http://schemas.xmlsoap.org/soap/envelope/", 
    elementFormDefault=XmlNsForm.QUALIFIED,
    xmlns={
            @XmlNs(namespaceURI = "http://schemas.xmlsoap.org/soap/envelope/", prefix = "SOAP-ENV"),
            @XmlNs(namespaceURI = "urn:b2bHotelSOAP", prefix = "ns1"),
            @XmlNs(namespaceURI = "http://www.w3.org/2001/XMLSchema", prefix = "xsd"),
            @XmlNs(namespaceURI = "http://www.w3.org/2001/XMLSchema-instance", prefix = "xsi"),
            @XmlNs(namespaceURI = "http://schemas.xmlsoap.org/soap/encoding/", prefix = "SOAP-ENC")

    }
)
@XmlAccessorType(XmlAccessType.FIELD)
package com.giove.viaggi.hsw.provider.hotelspro;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

我需要的是将soap解锁到这个bean中:

代码语言:javascript
复制
package myPackage;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="Envelope")
public class MyBean {

    @XmlPath("return/availableHotels/item")
    private List<Hotel> hotels;

    public List<Hotel> getHotels(){
        return this.hotels==null?new ArrayList<Hotel>():this.hotels;
    }
}

当我试图使用jaxbUnmarshaller解锁它时,它给我的酒店属性总是null,即使它们存在于soap响应中。

我犯了什么错误吗?

有人能帮我一下吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 20:39:50

MyBean

下面是您的@XmlPath类上的MyBean注释应该是什么样子。有些事情要注意:

  1. 您的域类必须与您希望应用于它的package-info类在同一个包中。
  2. 当您使用@XmlPath时,您需要在路径中包含每个步骤,您已经忽略了一些步骤。
  3. @XmlPath中的名称空间质量与您在@XmlSchema注释中定义的前缀相对应(参见:http://blog.bdoughan.com/2010/09/xpath-based-mapping-geocode-example.html)。

代码语言:javascript
复制
package com.giove.viaggi.hsw.provider.hotelspro;

import java.util.*;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="Envelope")
public class MyBean {

    @XmlPath("SOAP-ENV:Body/ns1:getAvailableHotelResponse/return/availableHotels/item")
    private List<Hotel> hotels;

    public List<Hotel> getHotels(){
        return this.hotels==null?new ArrayList<Hotel>():this.hotels;
    }

}

Note

我不将MyBean类映射到Envelope元素,而是将其映射到本地根return,然后将该元素传递给un堵。

  • http://blog.bdoughan.com/2012/08/handle-middle-of-xml-document-with-jaxb.html
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23883023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档