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
在此先感谢
答
从来就发现我的情况两种解决方法:
不设置XMLSCHEMA到编组。
设置一个
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中解释的那样。
感谢安德烈亚斯,从来就看了你的文章。让我感到意外的是,这在Spring-WS中并不是一个公开的问题,并且在论坛中没有很多评论。 – leaqui
这仍然是这个当前日期的问题? –
我认为情况几乎没有变化。几个月前,我发送了几个pull请求来开始解决一些问题,但我从来没有得到任何答复。我认为问题在于Spring-WS并不是真正的社区驱动项目:如果您与Pivotal签有支持合同,那么您将能够对产品进行更改,否则祝您好运。 –