2017-09-20 39 views
0

Ich habe ein Spring Boot-Projekt mit mehreren XSD-Schemas (ich verwende Spring-WS).So validieren Sie mehrere XSD-Schemas mit Spring PayloadValidatingInterceptor

Wenn ich den PayloadValidatingInterceptor von Spring zum Überprüfen von Anforderungen und Antworten verwende, funktioniert es nur mit dem neuesten Set-Schema.

Zum Beispiel:

public void addInterceptors(List<EndpointInterceptor> interceptors) { 
    PayloadValidatingInterceptor validatingInterceptor = new PayloadValidatingInterceptor(); 
    validatingInterceptor.setValidateRequest(true); 
    validatingInterceptor.setValidateResponse(true); 
    validatingInterceptor.setXsdSchema(getFirstSchema()); 
    validatingInterceptor.setXsdSchema(getSecondSchema()); 
    interceptors.add(validatingInterceptor); 
    super.addInterceptors(interceptors); 
} 

Dieser Ausschnitt wird Frühling nur das zweite Schema überprüfen macht, nicht die erste. Ich habe versucht, mehrere PayloadValidatingInterceptors zu erstellen, um sie mit super.addInterceptors (interceptors); hinzuzufügen, aber es hat auch nicht funktioniert. Die einzige Antwort, die ich im Stande war, zu finden (mit Java anstelle von XML) ist ab 2009:

https://jira.spring.io/browse/SWS-481

Kennt jemand eine Java-basierte Lösung Anfragen und Antworten von mehreren XSDs im selben Projekt zu validieren ?

+0

Haben Sie versucht, setXsdSchemaCollection anstelle von setXsdSchema? Wenn ja, was ist dann schief gelaufen? Wenn nein, warum nicht? –

+0

Ich habe es versucht, aber es funktioniert nicht. Ich konnte auch kein Beispiel für eine Implementierung mit setXsdSchema finden. Die Methode fordert Sie auf, XsdSchema [] getXsdSchemas() und XmlValidator createValidator() zu implementieren, aber ich habe keine Idee, wie Sie die Methode createValidator() implementieren. Wenn Sie einfach null zurückgeben, wird die Anwendung unbrauchbar und XmlValidtor kann nicht installiert werden. – facundop

Antwort

1

Eine Lösung für zukünftige Referenz schreiben, da ich kein einziges Beispiel im Internet finden konnte.

mehrere Schemas zu validieren, das ist, was ich getan habe:

Statt validatingInterceptor.setXsdSchema(), landete ich validatingInterceptor.setXsdSchemaCollection mit bis().

Dieser erhält eine XsdSchemaCollection, die Sie benötigen 2 Anon Methoden instanziieren und zu implementieren, wie folgt aus:

XsdSchemaCollection schemaCollection = new XsdSchemaCollection() { 

     @Override 
     public XsdSchema[] getXsdSchemas() { 
      return null; 
     } 

     @Override 
     public XmlValidator createValidator() { 
      try { 
       XmlValidator xmlValidator = XmlValidatorFactory.createValidator(getSchemas(), "http://www.w3.org/2001/XMLSchema"); 

       return xmlValidator; 
      } catch (IOException e) { 
       logger.error(e.getLocalizedMessage()); 
      } 
      return null; 
     } 
    }; 

Die GetSchemas() -Methode gibt ein Array von Ressourcen, von wo aus Sie die aktuellen XSDs passieren zu überprüfen:

public Resource[] getSchemas() { 
    List<Resource> schemaResources = new ArrayList<>(); 
    schemaResources.add(new ClassPathResource("firstService.xsd")); 
    schemaResources.add(new ClassPathResource("secondService.xsd")); 
    schemaResources.add(new ClassPathResource("thirdService.xsd")); 
    return schemaResources.toArray(new Resource[schemaResources.size()]); 
} 
Verwandte Themen