2017-07-11 2 views
0

私たちは、このプロジェクトでSpring-Integrationを使用しています。 http:outbound-gatewayで奇妙な問題が発生しています。休憩サービスを実行するには、次のヘッダーを渡す必要があります。 1)Accept=application/vnd.dsths.services-v1+xmlHTTP発信ゲートウェイがヘッダ値を操作しています

2)Content-Type=application/xml

奇妙な部分は、XML応答(Content-Type=application/vnd.dsths.services-v1+xml)、返された応答は、devの環境では、常に一意ではないということですが、クライアント環境におけるながら返され、JSONレスポンス(Content-Type=application/vnd.dsths.services-v1+json)があります戻ってきた。私はDEBUGをオンにしてログファイルを確認し、org.springframework.web.client.RestTemplateが[text/plain、application/json、application/* + json、*/`*]にヘッダを受け入れるように設定していることがわかりました。

2017-07-10 16:17:11,563 DEBUG [org.springframework.web.client.RestTemplate] (ajp-/10.226.55.163:8009-1) Setting request Accept header to [text/plain, application/json, application/*+json, */*] 

私はクライアント環境で accept=application/vnd.dsths.services-v1+xmlaccept=*/*の値をオーバーライドすることによって、この問題を克服することができる(このヘッダは、実際の「 Accept」ヘッダーではないことに注意してください)でした。

ここでの質問は、http:outbound-gatewayが異常な動作をしてヘッダー値を操作する理由です。 Spring Integrationがヘッダと"accept""Accept"の違いを識別できないのはなぜですか?私の修正は正しいですか?

答えて

0

の違いはですが、RFC-2616 HTTPヘッダーによれば、大文字と小文字は区別されません。Are HTTP headers case-sensitive?です。

そしてDefaultHttpHeaderMapperは従うこと勧告:

あなたが遠く離れて春の統合から、すでに春のMVCの一部であることを示し何
private void setHttpHeader(HttpHeaders target, String name, Object value) { 
    if (ACCEPT.equalsIgnoreCase(name)) { 
     if (value instanceof Collection<?>) { 

。あなたはロジックが提供HttpMessageConverterに基づいており、それは正直、正しいこと、です見ての通り

public void doWithRequest(ClientHttpRequest request) throws IOException { 
     if (this.responseType != null) { 
      Class<?> responseClass = null; 
      if (this.responseType instanceof Class) { 
       responseClass = (Class<?>) this.responseType; 
      } 
      List<MediaType> allSupportedMediaTypes = new ArrayList<>(); 
      for (HttpMessageConverter<?> converter : getMessageConverters()) { 
       if (responseClass != null) { 
        if (converter.canRead(responseClass, null)) { 
         allSupportedMediaTypes.addAll(getSupportedMediaTypes(converter)); 
        } 
       } 
       else if (converter instanceof GenericHttpMessageConverter) { 
        GenericHttpMessageConverter<?> genericConverter = (GenericHttpMessageConverter<?>) converter; 
        if (genericConverter.canRead(this.responseType, null, null)) { 
         allSupportedMediaTypes.addAll(getSupportedMediaTypes(converter)); 
        } 
       } 
      } 
      if (!allSupportedMediaTypes.isEmpty()) { 
       MediaType.sortBySpecificity(allSupportedMediaTypes); 
       if (logger.isDebugEnabled()) { 
        logger.debug("Setting request Accept header to " + allSupportedMediaTypes); 
       } 
       request.getHeaders().setAccept(allSupportedMediaTypes); 
      } 
     } 
    } 

RestTemplateコードを参照してください。 Acceptヘッダーは、クライアントがサーバーから処理できるものとまったく同じです。あなたがそのような行動を好きではないし、あなたのクライアントで確実な場合

、あなたはhttp:outbound-gatewayRestTemplateを注入したが、既にだけでHttpMessageConverterを希望することができます。

+0

大丈夫です。説明ありがとう。 MessageBuilder.removeHeader( "accept")はSpringフレームワークが正しいヘッダ 'Accept'を認識できるように動作するはずです。それは意味をなさないか、他の問題を予見していますか? –

+0

???あなたは完全に私を理解していない。私はいくつかのヘッダーを削除について話しますか?私は、「受け入れる」ための価値観とその克服方法を説明します。 Spring Integrationの 'Accept'ヘッダーは効果がなく、' RestTemplate'でオーバーライドされます。 –

関連する問題