对于嵌套对象,JAXB unmarshal始终为null值

时间:2012-09-24 21:12:11

标签: java xml web-services jaxb unmarshalling

我有一个Web服务,通​​过编写WSDL和底层XSD来定义,java服务器代码类/ java绑定是使用JAXB / xjc生成的。

所有东西看起来都很好服务正在运行...但是对于每个请求(在查看日志输出时看到格式良好),当通过我的java代码访问时,嵌套元素似乎总是为空。

有人可以弄清楚为什么customerId.getCustomer()总是返回null?

我的XSD(部分):

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:tip="http://example.org/tip" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.org/tip/pro">

<complexType name="id">
  <attribute name="id" type="int" use="required"/>
  <attribute name="name" type="string" use="optional"/>
</complexType>

<complexType name="customer_id">
  <sequence>
    <element name="customer" type="tip:id" minOccurs="0"/>
  </sequence>
</complexType>

<element name="get_customer_request" type="tip:customer_id"/>

</schema>

生成的类CustomerId:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "customer_id", propOrder = {"customer"})
public class CustomerId {
  protected Id customer;

  public Id getCustomer() {
    return customer;
  }

  public void setCustomer(Id value) {
    this.customer = value;
  }
}

为Id生成的类看起来类似,我认为没有什么特别之处。 在我的请求处理程序中,我得到了以下摘录:

处理程序:

JAXBElement<?> request = requestHandler.unmarshallRequest(inputStream);
Object jaxbClass = request.getDeclaredType();
expectedClass = CustomerId.class;
// next line does not throw exception with given XML
if (jaxbClass != expectedClass) throw new IllegalArgumentException();

CustomerId customerId = (CustomerId)request.getValue();
if (customerId == null) {
  logInfo("customerId: null");
} else if (customerId.getCustomer() == null) {
  // this is the part that always will be executed... why?
  logInfo("customerId.customer: null");
} else {
  logInfo("customer id: " + customerId.getCustomer().getId());
  // return mbean.getCustomer(customerId);
}

最后是一个示例请求XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<m:get_customer_request xmlns:m="http://example.org/tip/pro">
  <customer id="0" name="help"/>
</m:get_customer_request>

我删除了SOAP信封和正文标记,因为这不会造成任何麻烦。 谁能看到,我做错了什么? (我很确定,我做......) 谢谢你的支持!

1 个答案:

答案 0 :(得分:3)

第1部分

  

当我创建一个新的Id并使用它设置customerId.customer时,完整   输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<get_customer_request xmlns="example.com/tip/pro">
    <customer name="xy" id="1"/>
</get_customer_request>

根据此信息,您的JAXB映射似乎希望customer元素位于example.com/tip/pro命名空间中,您的请求文档应为:

<?xml version="1.0" encoding="ISO-8859-1"?>
<m:get_customer_request xmlns:m="http://example.org/tip/pro">
  <m:customer id="0" name="help"/>
</m:get_customer_request>

第2部分

  

在我的请求中将m:前缀添加到customer元素时,解析器   抱怨说他找到了m:客户和预期的客户。

这意味着您的XML架构与您的映射不匹配。如果您希望customer元素位于命名空间中,则可以将XML架构更改为以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns:tip="http://example.org/tip" 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.org/tip/pro"
    elementFormDefault="qualified">

    ...

</schema>

有关JAXB和命名空间的更多信息,请参阅: