因此,作为我使用新库的依赖冲突的一部分,我必须将我的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
}