2016-02-09 15 views
1

我有我的春天集成http出站網關這樣的東西。我用我自己的休息模板與ssl.I是500與法國字符連接,因此我注入UTF-8並支持媒體類型的消息converter.Now在我注入我自己的請求工廠和默認的休息模板之後注入兩個然後它開始接受法國characters.Now當我改變使用我自己的休息模板它不接受消息轉換器和時我嘗試注入這對我的休息模板,我得到這個例外http出境網關不轉換法國字符

Cause is - Could not write request: no suitable HttpMessageConverter found for request type [java.lang.String] and content type [text/plain;charset=UTF-8] 

這個工作對所有請求

<int-http:outbound-gateway id='batch-http' header-mapper="headerMapper" 
          request-channel='toHttp' 
          request-factory="requestFactory" 
          message-converters="batchHTTPConverter" 
          url-expression="payload.contains('${filterAttribute}') ? '${url1}' : '${url2}'" http-method="${httpMethod}" 
          expected-response-type='java.lang.String' charset='${charset}' 
          reply-timeout='${replyTimeout}' reply-channel='output'> 
</int-http:outbound-gateway> 

<beans:bean id="batchHTTPConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> 
    <beans:constructor-arg index="0" value="UTF-8"/> 
    <beans:property name="supportedMediaTypes" value = "application/json;UTF-8" /> 

</beans:bean> 


<beans:bean id="requestFactory" class="test.batch.httpclient.CustomClientHttpRequestFactory">  
<beans:constructor-arg ref="verifier"/> 
    </beans:bean> 

<beans:bean id="verifier" 
     class="batch.NullHostnameVerifier"> 

</beans:bean> 

這是不工作的法國人或任何輸入請求

<header-filter input-channel="input" 
        output-channel="inputX" header-names="x-death"/> 

    <service-activator input-channel="inputX" ref="gw" /> 

    <gateway id="gw" default-request-channel="toHttp" default-reply-timeout="0" error-channel="errors" /> 

    <beans:bean id="inputfields" class="testbatch.httpclient.HTTPInputProperties"> 
     <beans:property name="nonRetryErrorCodes" value="${nonRetryErrorCodes}"/> 
    </beans:bean> 
    <beans:bean id="responseInterceptor" class="testbatch.httpclient.ResponseInterceptor"> 
     <beans:property name="inputProperties" ref="inputfields" /> 
    </beans:bean> 

    <chain input-channel="errors" output-channel="output"> 
     <!-- examine payload.cause (http status code etc) and decide whether 
      to throw an exception or return the status code for sending to output --> 
     <header-filter header-names="replyChannel, errorChannel" /> 
     <transformer ref="responseInterceptor" /> 
    </chain> 


    <int-http:outbound-gateway id='batch-http' header-mapper="headerMapper" 
           request-channel='toHttp' 
           rest-template="batchRestTemplate" 
           url-expression="payload.contains('${filterAttribute}') ? '${url1}' : '${url2}'" http-method="${httpMethod}" 
           expected-response-type='java.lang.String' charset='${charset}' 
           reply-timeout='${replyTimeout}' reply-channel='output'> 
    </int-http:outbound-gateway> 

    <beans:bean id="batchHTTPConverter" class="org.springframework.http.converter.StringHttpMessageConverter" > 
     <beans:constructor-arg index="0" value="UTF-8"/> 
     <beans:property name="supportedMediaTypes" value = "application/json;UTF-8" /> 

    </beans:bean> 




    <beans:bean id="batchRestTemplate" class="testbatch.httpclient.BatchRestTemplate" > 
     <beans:property name="batchHTTPConverter" ref="batchHTTPConverter"/> 



</beans:bean> 



<beans:bean id="requestFactory" 
      class="testbatch.httpclient.CustomClientHttpRequestFactory"> 

<beans:constructor-arg ref="verifier"/> 

</beans:bean> 

<beans:bean id="verifier" 
      class="testbatch.httpclient.NullHostnameVerifier"> 

</beans:bean> 

<beans:bean id="headerMapper" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper" 
      factory-method="outboundMapper"> 
<beans:property name="outboundHeaderNames" value="${mapHeaders}"/> 
<beans:property name="userDefinedHeaderPrefix" value=""/> 
</beans:bean> 

<channel id="output" /> 
<channel id="input" /> 
<channel id="inputX" /> 
<channel id="toHttp" /> 

     </beans:beans> 

我休息模板

public class BatchRestTemplate extends RestTemplate{ 

    private static final Logger LOGGER = LoggerFactory 
       .getLogger(BatchRestTemplate.class); 
    private StringHttpMessageConverter batchHTTPConverter; 



    public StringHttpMessageConverter getBatchHTTPConverter() { 
     return batchHTTPConverter; 
    } 

    public void setBatchHTTPConverter(StringHttpMessageConverter batchHTTPConverter) { 
     this.batchHTTPConverter = batchHTTPConverter; 
    } 

    public BatchRestTemplate() { 
      super(createBatchHttpRequestFactory()); 

     List<HttpMessageConverter<?>> messageConverters= new ArrayList<HttpMessageConverter<?>>(); 
     messageConverters.addAll(getMessageConverters()); 
     messageConverters.add(getBatchHTTPConverter()); 
     super.setMessageConverters(messageConverters); 

    } 

    private static ClientHttpRequestFactory createBatchHttpRequestFactory() { 

      CloseableHttpClient httpClient; 
      HttpComponentsClientHttpRequestFactory httpRequestFactory; 
      final int timeout = 3000; 
      SSLConnectionSocketFactory socketFactory; 
      try { 
       socketFactory = new SSLConnectionSocketFactory(
         SSLContext.getDefault(), 
         new String[] {"TLSv1"}, 
         null, 
         SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

      Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() 
        .register("http", PlainConnectionSocketFactory.getSocketFactory()) 
        .register("https", socketFactory) 
        .build(); 
      PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry); 
      cm.setMaxTotal(700); 
      cm.setDefaultMaxPerRoute(300); 
      cm.closeExpiredConnections(); 


      RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout) 
        .setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build(); 



      httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).setConnectionManager(cm).build(); 


      httpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); 

      return httpRequestFactory; 

      } 

      catch (Exception e) { 
       LOGGER.debug("error exception", e); 


    } 
      return null; 
    } 


} 

回答

1

你在你自己的代碼中的錯誤:

public BatchRestTemplate() { 
    .......... 
    messageConverters.add(getBatchHTTPConverter()); 
    .......... 

} 

但...還沒有batchHTTPConverter!它只會在setBatchHTTPConverter()之後出現。

換句話說,你不能在構造函數中使用屬性,因爲setter在對象實例化後調用。

相關問題