JAXB使用MTOM进行解组

时间:2014-03-05 10:05:40

标签: jaxb unmarshalling mtom apache-tomee

我有一个问题是为一个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);

我真的不确定出现了什么问题,或者我应该做什么,因为没有抛出任何异常,文档总是空的。

1 个答案:

答案 0 :(得分:0)

为了在JAXB解组期间解析附件,需要在AttachmentUnmarshaller上设置Unmarshaller

当JAXB在JAX-WS的封面下使用时,会自动处理。如果您直接与XML交互,则需要实现并设置AttachmentUnmarshaller您自己。以下是一个有用的示例链接: