2014-01-08 4 views
2

Ниже приведен мой класс конфигурации Spring Spring. Я хотел бы иметь весенний xml для этого. Путаница у меня есть, как преобразовать @Bean HttpClient в XML (мне нужно использовать фабричный метод?)Преобразование конфигурации Spring java в xml-конфигурацию

import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.security.KeyStore; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 
import java.util.List; 

import javax.net.ssl.SSLContext; 

import org.apache.http.client.HttpClient; 
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 
import org.apache.http.conn.ssl.SSLContexts; 
import org.apache.http.conn.ssl.TrustStrategy; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; 
import org.springframework.http.client.ClientHttpRequestFactory; 
import org.springframework.http.client.ClientHttpRequestInterceptor; 
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; 
import org.springframework.web.client.RestTemplate; 

import com.google.common.collect.Lists; 

@Configuration 
    public class RestClientConfig { 

     @Bean 
     public ClientHttpRequestFactory httpRequestFactory() throws GeneralSecurityException, IOException { 
      return new HttpComponentsClientHttpRequestFactory(httpClient()); 
     } 

     @Bean 
     public HttpClient httpClient() throws GeneralSecurityException, IOException { 
      KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      TrustStrategy allTrust = new TrustStrategy() { 
       @Override 
       public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
        return true; 
       } 
      }; 

      SSLContext sslcontext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, allTrust).build(); 

      SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
      CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); 
      return httpClient; 
     } 

     @Bean 
     public RestTemplate restTemplate() throws GeneralSecurityException, IOException { 
      RestTemplate restTemplate = new RestTemplate(httpRequestFactory()); 
      List<ClientHttpRequestInterceptor> interceptors = Lists.newArrayList(); 
      interceptors.add(new RestAuthInterceptor()); 

      restTemplate.setInterceptors(interceptors); 

      return restTemplate; 
     } 

    } 

:: EDIT :: Это то, что я сделал после того, как получать помощь от Хосе Луис Мартин и MariuszS. XML файла:

<bean id="httpClient" class="com.orbit.restclient.support.CustomHttpClientFactory" /> 

    <bean class="org.springframework.web.client.RestTemplate"> 
     <constructor-arg>    
      <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
       <constructor-arg ref="httpClient" /> 
      </bean> 
     </constructor-arg> 
     <property name="interceptors"> 
      <list> 
       <bean class="com.orbit.restclient.support.RestAuthInterceptor" /> 
      </list> 
     </property> 
    </bean> 

Пользовательский класс: Конфигурация

public class CustomHttpClientFactory implements FactoryBean<HttpClient> { 

    @Override 
    public HttpClient getObject() throws Exception { 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     // TODO: update code here to validate certificate. This code allows all certificates 
     TrustStrategy allTrust = new TrustStrategy() { 
      @Override 
      public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
        return true; 
      } 
     }; 

     SSLContext sslcontext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, allTrust).build(); 

     SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
     CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); 
     return httpClient; 
    } 

    @Override 
    public Class<HttpClient> getObjectType() { 
     return HttpClient.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 

} 
+2

Для преобразования этой конфигурации Java в XML определенно не очевидно, и я не рекомендую этого делать. Почему вы хотите? –

+0

Я подготовил POC, используя весну 3.2 с конфигурацией Java. Теперь меня попросят внедрить это в существующее приложение (со всей конфигурацией xml). Мне задали xml-конфигурацию (java config, может быть и позже !!) – Ketan

+0

Вы можете смешивать xml и конфигурацию Java в одном приложении ... – MariuszS

ответ

2

Попробуйте с:

<bean id="httpClient" class="test.HttpClientFactoryBean" /> 

    <bean id="httpRequestFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
     <constructor-arg ref="httpClient"></constructor-arg> 
    </bean> 

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
     <property name="interceptors"> 
      <list> 
       <bean class="RestAuthInterceptor" /> 
      </list> 
     </property> 
    </bean> 

И

public class HttpClientFactoryBean extends AbstractFactoryBean<HttpClient> { 

    @Override 
    public Class<?> getObjectType() { 
     return HttpClient.class; 
    } 

    @Override 
    protected HttpClient createInstance() throws Exception { 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     TrustStrategy allTrust = new TrustStrategy() { 
      @Override 
      public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
       return true; 
      } 
     }; 

     SSLContext sslcontext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, allTrust).build(); 

     SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
     CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); 

     return httpClient; 
    } 

} 
2

Spring Java гораздо проще писать и читать, но если это ваше требование, то смотрите на что-то вроде этого - это более понятие, как рабочий раствор :)

решение с завода и Method Injection

<beans> 

    <bean name="httpRequestFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
     <constructor-arg value="httpClient"/> 
    </bean> 

    <bean id="httpClientFactory" class="my.custom.HttpClientFactory" scope="prototype"> 
     <lookup-method name="create" bean="httpClient"/> 
    </bean> 
    <bean name="httpClient" class="org.apache.http.client.HttpClient"/> 

    <bean name="restTemplateFactory" class="my.custom.RestTemplateFactory" scope="prototype"> 
     <lookup-method name="create" bean="restTemplate"/> 
    </bean> 
    <bean name="restTemplate" class="org.springframework.web.client.RestTemplate"/> 

</beans> 

и пример завода фасоли:

public class HttpClientFactory { 

    public HttpClient create(){ 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     TrustStrategy allTrust = new TrustStrategy() { 
      @Override 
      public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
       return true; 
      } 
     }; 

     SSLContext sslcontext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, allTrust).build(); 

     SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
     CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); 
     return httpClient; 
    } 

} 

Это также можно использовать ServiceLocatorFactoryBean

+1

+1 Если вы не можете использовать конфигурацию '@ Bean', вы можете использовать этот или даже« FactoryBean ». –

+0

Я думаю, что это не сработает, поскольку вы переопределяете метод create с помощью метода lookup, который никогда не будет выполняться, и простой HttpClient будет вообще вводиться. –

+0

Это решение требует прототипа 'scope =" ', исправлено. Это должно работать, это общая картина, описанная в Spring Reference Documentation :) – MariuszS

Смежные вопросы