我从他们的API获得了第三方提供商生成的一些类 - 特别是公司大楼(http://xmlgw.companieshouse.gov.uk/)
我无法从API解组部分响应。我可以将对象强制转换为包含GovTalkMessage
标记的Body
对象 - 但是在解组后我得到的基础对象是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的内容(生成的List<Object>
pojo中的GovTalkMessage
)应该在列表的第一个元素中有一个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
我在unmarshal做错了吗?
提前致谢
更新
如果我将package-info.java
修改为
namespace = "http://xmlgw.companieshouse.gov.uk/v1-0/schema"
而不是
namespace = "http://www.govtalk.gov.uk/CM/envelope"
然后是unmarshal的作品。但我无法将两者编组到GovTalkMessage
并将CompanyAppointments
解组为工作,即使我直接指定它:
JAXBContext payloadContext = JAXBContext.newInstance(CompanyAppointments.class);
Unmarshaller unmarshaller = payloadContext.createUnmarshaller();
unmarshaller.unmarshal((Node)message.getBody().getAny().get(0), CompanyAppointments.class).getValue();
这只会给我一个CompanyAppointments
字段,其中包含空字符。
答案 0 :(得分:0)
似乎用于生成绑定类的名称空间和响应中收到的名称空间是冲突的。
绑定类和XML响应将需要指出错误:)。
我建议你使用包名来代替创建JAXBContext的类。
final JAXBContext context = JAXBContext.newInstance("com.something"...);