2016-07-26 51 views
2

我正嘗試使用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

從來就發現我的情況兩種解決方法:

  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())); 
    } 
} 
0

這不是SAAJ的問題,而是Spring-WS。這是由於Spring-WS將XOP編碼的消息傳遞給模式驗證器,而該模式驗證器不理解XOP。最終,問題在於Spring-WS沒有爲XOP/MTOM定義明確的處理模型,正如我在this article中解釋的那樣。

+0

感謝安德烈亞斯,從來就看了你的文章。讓我感到意外的是,這在Spring-WS中並不是一個公開的問題,並且在論壇中沒有很多評論。 – leaqui

+0

這仍然是這個當前日期的問題? –

+0

我認爲情況幾乎沒有變化。幾個月前,我發送了幾個pull請求來開始解決一些問題,但我從來沒有得到任何答覆。我認爲問題在於Spring-WS並不是真正的社區驅動項目:如果您與Pivotal簽有支持合同,那麼您將能夠對產品進行更改,否則祝您好運。 –