2017-09-20 62 views
0

複数のXSDスキーマを持つSpringブートプロジェクトがあります(Spring-WSを使用しています)。SpringのPayloadValidatingInterceptorで複数のXSDスキーマを検証する方法

私がSpringのPayloadValidatingInterceptorを使用して要求と応答を検証すると、最新の設定済みスキーマでのみ動作します。例えば

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

このスニペットは、春にはまず、唯一の2番目のスキーマを検証するためではないでしょう。私は複数のPayloadValidatingInterceptorsを作成してsuper.addInterceptors(インターセプタ)で追加しようとしましたが、どちらも機能しませんでした。私は(Javaの代わりにXMLを)見つけることができた唯一の応答は、2009年からです。

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

誰もが同じプロジェクト内の複数のXSDからの要求と応答を検証するために、Javaベースのソリューションを知っています?

+0

setXsdSchemaではなくsetXsdSchemaCollectionを使用してみましたか?はいの場合、何が問題になりましたか?いいえの場合は、なぜですか? –

+0

私は試しましたが、動作しません。 setXsdSchemaを使って実装のサンプルを見つけることができませんでした。このメソッドは、XsdSchema [] getXsdSchemas()とXmlValidator createValidator()を実装するように要求しますが、createValidator()メソッドを実装する方法はわかりません。 nullを返すだけでアプリケーションが使用できなくなり、XmlValidtorをインスタンス化できなくなります。 – facundop

答えて

1

私はインターネットで一つの例を見つけることができなかったので、将来の参照のために解決策を投稿する。

は、複数のスキーマを検証するには、これは私がやったことです:validatingInterceptor.setXsdSchema()の代わりに

、私は)(validatingInterceptor.setXsdSchemaCollectionを使用して終了しました。

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; 
     } 
    }; 

getSchemas()メソッドは、現在のXSDを検証するために通過し、そこからリソースの配列を返し:

これは、このように、インスタンス化および2つの匿名メソッドを実装する必要がXsdSchemaCollectionを受け取ります。

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()]); 
} 
関連する問題