Ive fand zwei Abhilfen für meine Situation:
Nicht die XmlSchema Einstellung Einweiser.
Einstellung eines ValidationEventHandler
für den Marshaller, der XOP-Fehler überspringt.
Dies ist ein Beispiel für eine ValidationEventHandler
zu Einweiser Einstellung, die XOP Ausfälle überspringt:
Abstrakte Oberklasse:
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;
}
}
Betonklasse für Unmarshaller:
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());
}
}
Für Einweiser Ich suche nach der Bedingung, die den Fall identifiziert, weil die ValidationEventLocator
haben nur das Objekt gesetzt und es könnte was auch immer sein.
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
Unterklasse, die MTOM aktiviert und fügt beide Event-Handler:
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()));
}
}
Dank Andreas, lesen Ive Ihren Artikel. Was mich überrascht, ist, dass dies in Spring-WS kein offenes Thema ist und in Foren nicht sehr kommentiert wird. – leaqui
Dies ist immer noch ein Problem zu diesem aktuellen Datum? –
Ich denke, die Situation ist ziemlich unverändert. Vor einigen Monaten habe ich ein paar Pull-Requests gesendet, um einige der Probleme zu beheben, aber ich habe nie eine Antwort erhalten. Ich denke, das Problem ist, dass Spring-WS kein Community-Projekt ist: Wenn Sie einen Supportvertrag mit Pivotal haben, können Sie Änderungen am Produkt vornehmen, ansonsten viel Glück. –