Jaxb从2.2.6升级到2.2.11时,无法正确解析XML

时间:2015-12-28 21:35:20

标签: java xml jaxb

因此,作为我使用新库的依赖冲突的一部分,我必须将我的Jaxb库从2.2.6升级到2.2.11(仅使用最新版本但仅在升级到2.2.7时出现问题好)。作为我的更改的一部分,我包含了新的jaxb依赖项以及使用jaxb属性文件而不是索引文件。在完成所有编译之后,我注意到我的一个测试开始失败。它失败了,因为在将XML转换回Java对象时,我在元素列表中得到一个空值(参见下面的XML)。它似乎理解我在Jaxb上下文中的类,但它没有返回预期的Java值。

我有以下XML,由Jaxb使用我的Java类生成:

此XML不起作用

<ns4:serviceResponse xmlns:ns2="v3" xmlns:ns3="v4" xmlns:ns4="v2" xmlns:ns5="v1" xmlns:ns6="apiType">
    <result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns4:list">
        <listElement xsi:type="ns4:mobileApp">
            <appProfile>
                <appStatus>ACTIVE</appStatus>
                <appVersion>1.0</appVersion>
            </appProfile>
        </listElement>
    </result>
</ns4:serviceResponse>

当我尝试将此XML解析回Java时,List返回Null(但其他所有内容都正常工作)。我不确定为什么会发生这种情况,因为当我尝试使用列表之外的元素时,它可以正常工作。

使用XML

<ns4:serviceResponse xmlns:ns2="v3" xmlns:ns3="v4" xmlns:ns4="v2" xmlns:ns5="v1" xmlns:ns6="apiType">
    <result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns4:mobileApp">
        <appProfile>
            <appStatus>ACTIVE</appStatus>
            <appVersion>1.0</appVersion>
        </appProfile>
    </result>
</ns4:serviceResponse>

有什么想法吗?注意,这两个XML都是使用Jaxb创建的。

以下是我的Java对象(仅显示Jaxb注释)。

ServiceResponse.java

@XmlRootElement(name="serviceResponse", namespace="v2")
@XmlType(name="serviceResponse", namespace="V2")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@XmlSeeAlso({com.dibs.service.v1.data.error.ServiceError.class, com.dibs.service.v2.data.error.ServiceError.class})
public class ServiceResponse<X extends ServiceData> implements com.dibs.service.common.ServiceResponse<X>
{
    //Property declarations

    @XmlJavaTypeAdapter(HttpCodeAdapter.class)
    @XmlElement
    public HttpCode getHttpCode(){/*Some code*/}

    @XmlElement
    public String getMessage(){/*Some code*/}

    @XmlElement
    @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = ApiConstants.V2_JSON_TYPE_PROPERTY_NAME)
    public X getResult(){/*Some Code*/}

    @XmlElement
    public ServiceResponseCode getServiceResponseCode(){/*Some code*/}

    @XmlElement
    @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = ApiConstants.V2_JSON_TYPE_PROPERTY_NAME)
    public void setError(ServiceError error){/*Some code*/}

    //other unrelated code
}

SerivceDataList.java - 似乎有点像这个家伙

@XmlType(name = "list", namespace = ApiConstants.V2_NAMESPACE)
public class ServiceDataList<D extends ServiceData> implements ServiceData
{
   //Property declarations and unrelated code

    @XmlElement(name = "listElement")
    @JsonProperty("dataList")
    @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = ApiConstants.V2_JSON_TYPE_PROPERTY_NAME)
    public List<D> getDataList(){/*Some Code*/}

}

MobileApp.java

@XmlRootElement(name = "mobileApp")
@XmlType(name = "mobileApp", namespace = ApiConstants.V2_NAMESPACE)
public class MobileApp implements ServiceEntity<Long>
{
    //Property declarations and getters and setters only

    MobileAppProfile profile;    //see next code block
}

MobileAppProfile.java

@XmlRootElement(name = "mobileAppProfile")
@XmlType(name = "mobileAppProfile", namespace = ApiConstants.V2_NAMESPACE)
public class MobileAppProfile implements ServiceData, Serializable
{
   //Only String and Enum declarations with getters and setters
}

0 个答案:

没有答案