我有一个问题是为一个RetrieveDocumentSetResponse解组MTOM,这是XDS的一部分。
在我生成的JAXB文件中,我只有一个byte[]
的元素文档。
在我执行通常的unmarshalling
步骤之后:
final JAXBContext jc = JAXBContext.newInstance(RetrieveDocumentSetResponseType.class);
final Unmarshaller u = jc.createUnmarshaller();
final JAXBElement<RetrieveDocumentSetResponseType> rdsJaxb = u.unmarshal(
soapResponse.getSOAPBody().getElementsByTagNameNS("urn:ihe:iti:xds-b:2007", "RetrieveDocumentSetResponse").item(0),
RetrieveDocumentSetResponseType.class);
final RetrieveDocumentSetResponseType rdsResp = rdsJaxb.getValue();
我的文档是空的:rdsResp.getDocument().length == 0
。
在使用TCPMonitor
进行检查时,我发现该文档正在通过该行发送,因此错误必须位于解组中的某个位置。
我尝试使用DataHandler
而不是byte []并使用@XMLMimeType
注释注释文档变量无效。我正在使用TomEE作为我的部署目标,它使用我认为的JAXB的RI版本。
我还使用常规调度进行Web服务调用,确保启用MTOM:
final Service repoService;
final QName repoPort = new QName(XdsProperties.XDS_REPOSITORY_NAMESPACE, XdsProperties.XDS_REPOSITORY_PORT);
if (XdsProperties.XDS_REPOSITORY_WSDL == null) {
repoService = Service.create(new QName(XdsProperties.XDS_REPOSITORY_NAMESPACE, XdsProperties.XDS_REPOSITORY_SERVICE));
} else {
repoService = Service.create(XdsProperties.XDS_REPOSITORY_WSDL, new QName(XdsProperties.XDS_REPOSITORY_NAMESPACE,
XdsProperties.XDS_REPOSITORY_SERVICE));
}
repoService.addPort(repoPort, SOAPBinding.SOAP12HTTP_MTOM_BINDING, XdsProperties.XDS_REPOSITORY_ENDPOINT);
final MTOMFeature mtomFt = new MTOMFeature(true);
REPOSITORY_DISPATCH = repoService.createDispatch(repoPort, SOAPMessage.class, Service.Mode.MESSAGE, addrFt, mtomFt);
我甚至做到了:
REPOSITORY_DISPATCH.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, soapAction);
final SOAPBinding binding = (SOAPBinding) REPOSITORY_DISPATCH.getBinding();
binding.setMTOMEnabled(true);
我真的不确定出现了什么问题,或者我应该做什么,因为没有抛出任何异常,文档总是空的。
答案 0 :(得分:0)
为了在JAXB解组期间解析附件,需要在AttachmentUnmarshaller
上设置Unmarshaller
。
当JAXB在JAX-WS的封面下使用时,会自动处理。如果您直接与XML交互,则需要实现并设置AttachmentUnmarshaller
您自己。以下是一个有用的示例链接: