gpt4 book ai didi

java - JAXB 解码对嵌套对象始终具有空值

转载 作者:数据小太阳 更新时间:2023-10-29 02:31:21 24 4
gpt4 key购买 nike

我有一个网络服务,通过编写它的 WSDL 和底层 XSD 来定义,并且 java 服务器代码类/java 绑定(bind)是使用 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 部分

When I create a new Id and set customerId.customer with this, the full output is

<?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 部分

When putting m: prefix to customer element in my request, the parser complains that he found m:customer and expected customer.

这意味着您的 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 和 namespace 的更多信息,请参阅:

关于java - JAXB 解码对嵌套对象始终具有空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12572998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com