【发布时间】:2014-07-09 01:16:27
【问题描述】:
我从第 3 方提供商那里为他们的 API 生成了一些类 - 特别是 Companies House (http://xmlgw.companieshouse.gov.uk/)
我在解组来自 API 的响应部分时遇到问题。我可以将对象转换为包含Body 标记的GovTalkMessage 对象 - 但我在解组后返回的底层对象是ElementNSImpl 对象,而不是预期的pojo。
示例
我创建了一个这样的请求:http://xmlgw.companieshouse.gov.uk/examples/companydetails_req.xml
并得到这样的回复:http://xmlgw.companieshouse.gov.uk/examples/companydetails_reply.xml
在回复中可以看到有:
<Body>
<CompanyDetails xmlns="http://xmlgw.companieshouse.gov.uk/v1-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlgw.companieshouse.gov.uk/v1-0/schema/CompanyDetails-v2-1.xsd">
...
</Body>
因此,Body 的内容(即生成的GovTalkMessage pojo 中的List<Object>)在列表的第一个元素中应该有一个CompanyDetails 对象。相反,我有ElementNSImpl。
这是编组代码,它工作正常 - 可以将其发送到 API 端点并返回一个 xml 响应,如上面的示例:
JAXBContext context = JAXBContext.newInstance(GovTalkMessage.class, CompanyDetailsRequest.class, CompanyDetails.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
InputStream in = Request.Post ... //omitted - send to server, get response
Unmarshaller unmarshaller = context.createUnmarshaller();
GovTalkMessage reply = (GovTalkMessage)unmarshaller.unmarshal(in); //ok
Object object = reply.getBody().getAny().get(0);
//object is ElementNSImpl - should be CompanyDetails
我在解组中做错了吗?
提前致谢
更新
如果我修改package-info.java 有
namespace = "http://xmlgw.companieshouse.gov.uk/v1-0/schema"
而不是
namespace = "http://www.govtalk.gov.uk/CM/envelope"
然后解组工作。但我无法让 both 编组到 GovTalkMessage 并解组到 CompanyAppointments 工作,即使我直接指定它:
JAXBContext payloadContext = JAXBContext.newInstance(CompanyAppointments.class);
Unmarshaller unmarshaller = payloadContext.createUnmarshaller();
unmarshaller.unmarshal((Node)message.getBody().getAny().get(0), CompanyAppointments.class).getValue();
这只是给了我一个CompanyAppointments,其中的字段充满了空值。
【问题讨论】: