Java SAAJ是否与MTOM和x2B兼容;XOP?

Java SAAJ是否与MTOM和x2B兼容;XOP?,java,spring-ws,mtom,saaj,xop,Java,Spring Ws,Mtom,Saaj,Xop,我试图在SpringWeb服务中使用MTOM+XOP返回一个字节[],但当编组结果时,它抛出一个SAXParseException,并显示以下消息: cvc type.3.1.2:元素“dataHandler”是一个简单类型,因此它必须没有元素信息项[子项] 似乎在写入XOP标记后,验证器会遇到它,而不是它所期望的字节[]内容,并抛出一个致命级别的SAXParseException来停止进程 我正在使用: JDK1.7 SAAJ 1.3 肥皂1.1 弹簧4.1.4.1释放 SpringWS2.

我试图在SpringWeb服务中使用MTOM+XOP返回一个字节[],但当编组结果时,它抛出一个SAXParseException,并显示以下消息:

cvc type.3.1.2:元素“dataHandler”是一个简单类型,因此它必须没有元素信息项[子项]

似乎在写入XOP标记后,验证器会遇到它,而不是它所期望的字节[]内容,并抛出一个致命级别的SAXParseException来停止进程

我正在使用:

  • JDK1.7
  • SAAJ 1.3
  • 肥皂1.1
  • 弹簧4.1.4.1释放
  • SpringWS2.2.0.0版本

提前感谢

这不是SAAJ的问题,而是SpringWS的问题。这是因为SpringWS将XOP编码的消息传递给模式验证器,而模式验证器不理解XOP。最终的问题是Spring WS没有一个定义良好的XOP/MTOM处理模型,正如我在中所解释的。

我发现了两种解决方案:

  • 未将xmlschema设置为封送处理程序

  • ValidationEventHandler
    设置为跳过XOP故障的封送拆收器

  • 这是一个将
    ValidationEventHandler
    设置为marshaller以跳过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());
      }
    }
    
    对于marshaller,我正在搜索识别案例的条件,因为
    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()));
      }
    }
    

    谢谢Andreas,我读了你的文章。让我惊讶的是,这在SpringWS中不是一个公开的问题,在论坛上也没有太多评论。到目前为止,这仍然是一个问题?我认为情况几乎没有改变。几个月前,我发送了几个请求,开始修复一些问题,但我从未得到响应。我认为问题在于SpringWS实际上不是一个社区驱动的项目:如果您与Pivotal签订了支持合同,那么您将能够对产品进行更改,否则祝您好运。