SAAJ与MTOM + XOP兼容吗?

问题描述:

我正尝试使用MTOM + XOP到在Spring Web服务返回一个byte [],但编组的结果时,它抛出与消息的SAXParseException:SAAJ与MTOM + XOP兼容吗?

CVC-type.3.1.2:元素“的DataHandler”是一个简单的类型,所以它必须没有元素信息项[children]。

看来,写作,XOP标签,验证满足它,而不是它预期并引发与停止进程FATAL水平的SAXParseException字节[]的内容之后。

I'm使用:

  • JDK 1.7
  • SAAJ 1.3
  • SOAP 1.1
  • 春4.1.4.RELEASE
  • 春WS 2.2.0.RELEASE

在此先感谢

从来就发现我的情况两种解决方法:

  1. 不设置XMLSCHEMA到编组。

  2. 设置一个ValidationEventHandler来编组一个跳过XOP故障。

这是一个ValidationEventHandler设置为编组一个跳过XOP故障的一个示例:

抽象超:

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.ValidationEventHandler; 

abstract class XopAwareValidationEventHandler implements ValidationEventHandler { 

    private static final String CVC_TYPE_3_1_2 = "cvc-type.3.1.2"; 

    private ValidationEventHandler realHandler; 

    XopAwareValidationEventHandler(final ValidationEventHandler handler) { 
    this.setRealHandler(handler); 
    } 

    @Override 
    public boolean handleEvent(final ValidationEvent event) { 
    final boolean result = this.getRealHandler().handleEvent(event); 
    if (!result) { 
     if (event.getMessage() != null && event.getMessage().startsWith(CVC_TYPE_3_1_2)) { 
     return this.isXopEvent(event); 
     } 
    } 
    return result; 
    } 

    abstract boolean isXopEvent(ValidationEvent validationEvent); 

    private ValidationEventHandler getRealHandler() { 
    return realHandler; 
    } 

    private void setRealHandler(final ValidationEventHandler realHandler) { 
    this.realHandler = realHandler; 
    } 
} 

混凝土类解组:

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.ValidationEventHandler; 

class XopAwareUnmarshallingValidationEventHandler extends XopAwareValidationEventHandler { 

    private static final String XOP_INCLUDE = "xop:Include"; 

    XopAwareUnmarshallingValidationEventHandler(final ValidationEventHandler handler) { 
    super(handler); 
    } 

    @Override 
    boolean isXopEvent(final ValidationEvent validationEvent) { 
    final ValidationEventLocator locator = validationEvent.getLocator(); 
    return locator != null && locator.getNode() != null && 
     locator.getNode().getFirstChild() != null && 
     XOP_INCLUDE.equals(locator.getNode().getFirstChild().getNodeName()); 
    } 
} 

对于编组我正在寻找识别该情况的条件,因为ValidationEventLocator只有对象设置,它可以是任何。

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.ValidationEventHandler; 
import javax.xml.bind.ValidationEventLocator; 

public class XopAwareMarshallingValidationEventHandler extends XopAwareValidationEventHandler { 

    public XopAwareMarshallingValidationEventHandler(final ValidationEventHandler handler) { 
    super(handler); 
    } 

    boolean isXopEvent(final ValidationEvent validationEvent) { 
    final ValidationEventLocator locator = validationEvent.getLocator(); 
    return locator != null && locator.getNode() == null; 
    } 
} 

org.springframework.oxm.jaxb.Jaxb2Marshaller子激活MTOM,并增加了两个事件处理程序:

import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

import org.springframework.oxm.jaxb.Jaxb2Marshaller; 

import XopAwareMarshallingValidationEventHandler; 
import XopAwareUnmarshallingValidationEventHandler; 

public class XopAwareJaxb2Marshaller extends Jaxb2Marshaller { 

    public XopAwareJaxb2Marshaller() { 
    this.setMtomEnabled(true); 
    } 

    protected void initJaxbMarshaller(final Marshaller marshaller) throws JAXBException { 
    super.initJaxbMarshaller(marshaller); 

    marshaller.setEventHandler(new XopAwareMarshallingValidationEventHandler(marshaller.getEventHandler())); 
    } 

    protected void initJaxbUnmarshaller(final Unmarshaller unmarshaller) throws JAXBException { 
    super.initJaxbUnmarshaller(unmarshaller); 

    unmarshaller.setEventHandler(new XopAwareUnmarshallingValidationEventHandler(unmarshaller 
     .getEventHandler())); 
    } 
} 

这不是SAAJ的问题,而是Spring-WS。这是由于Spring-WS将XOP编码的消息传递给模式验证器,而该模式验证器不理解XOP。最终,问题在于Spring-WS没有为XOP/MTOM定义明确的处理模型,正如我在this article中解释的那样。

+0

感谢安德烈亚斯,从来就看了你的文章。让我感到意外的是,这在Spring-WS中并不是一个公开的问题,并且在论坛中没有很多评论。 – leaqui

+0

这仍然是这个当前日期的问题? –

+0

我认为情况几乎没有变化。几个月前,我发送了几个pull请求来开始解决一些问题,但我从来没有得到任何答复。我认为问题在于Spring-WS并不是真正的社区驱动项目:如果您与Pivotal签有支持合同,那么您将能够对产品进行更改,否则祝您好运。 –