首页 文章

通过Spring注入RestTemplate

提问于
浏览
0

我将这部分代码作为示例:

public SapRestClient(final String scheme, final String host, 
  final int port, final String username, final String password, 
  final HttpClientConnectionManager connectionManager, 
  final RequestConfig requestConfig) {

final BasicCredentialsProvider credentialsProvider = 
  new BasicCredentialsProvider(); 
credentialsProvider.setCredentials(authscope, credentials);

final CloseableHttpClient httpClient =
  HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider)
  .setConnectionManager(connectionManager)
  .setDefaultRequestConfig(requestConfig).build();

final HttpComponentsClientHttpRequestFactory requestFactory = 
  new HttpComponentsClientHttpRequestFactory(httpClient);
final BufferingClientHttpRequestFactory bufferingRequestFactory = 
  new BufferingClientHttpRequestFactory(requestFactory;
this.restTemplate = new RestTemplate(bufferingRequestFactory);

我会在Spring做这样的事情 . 我写了这段代码:

<bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig"
        factory-method="custom">
        <property name="socketTimeout" value="5000" />
        <property name="connectTimeout" value="5000" />
    </bean>

    <bean id="requestConfig" factory-bean="requestConfigBuilder"
        factory-method="build" />

    <bean id="connectionManager"
        class="org.apache.http.conn.HttpClientConnectionManager">
        <property name="maxTotal" value="30" />
        <property name="defaultMaxPerRoute" value="50" />
    </bean>

    <bean id="credentialsProvider" class="org.apache.commons.httpclient.auth.CredentialsProvider"/>


    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder"
        factory-method="create">
        <property name="defaultRequestConfig" ref="requestConfig" />
        <property name="defaultConnectionManager" ref="connectionManager"/>
        <property name="defaultCredentialsProvider" ref="credentialsProvider"/>
    </bean>

    <bean id="httpClient" factory-bean="httpClientBuilder"
        factory-method="build" />

    <bean id="requestFactory" factory-bean="httpComponentsClientHttpRequestFactory">
        <property name="defaultHttpClient" ref="httpClient"/>
    </bean>

    <bean id="bufferingRequestFactory" factory-bean="bufferingClientHttpRequestFactory">
        <property name="defaultRequestFactory" ref="requestFactory"/>
    </bean>

    <bean id="bufferingClientHttpRequestFactory" class="org.springframework.http.client.BufferingClientHttpRequestFactory"/>

    <bean id="twRestTemplate" class="org.springframework.web.client.RestTemplate">
        <constructor-arg>
            <ref bean="bufferingRequestFactory" />
        </constructor-arg>
        <property name="errorHandler" ref="customErrorHandler" />
    </bean>

我在一个closeableHttpClient中放置了一个connectionManager(带有连接设置)和一个请求配置器来进行超时管理(我看到了这个链接) . 我把这个bean放在HttpComponentClientHttpRequestFactory中,然后放在BufferingRequestFactory中,最后放在RestTemplate中 .

但是在运行时我得到了这个错误:

WARN [localhost-startStop-1] [CloseAwareApplicationContext]在上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建在类路径资源[jkdsfj-spring中定义的名称为'defaultTwProductSearchService'的bean时出错 . xml]:在设置bean属性'twNavigatorClientGateway'时无法解析对bean'twNavigatorClientGateway'的引用;嵌套异常是org.springframework.beans.factory.BeanCreationException:在类路径资源[jkdsfj-spring.xml]中定义的名称为'defaultTwNavigatorClientGateway'的bean创建错误:在设置bean属性'twRestTemplate'时无法解析对bean'twRestTemplate'的引用;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建类路径资源[joggrouptwconnector-spring.xml]中定义的名为'twRestTemplate'的bean时出错:在设置构造函数参数时无法解析对bean'bufferingRequestFactory'的引用;嵌套异常是org.springframework.beans.factory.BeanCreationException:在类路径资源[jkdsfj-spring.xml]中定义的名称为'bufferingRequestFactory'的bean创建错误:bean的实例化失败;嵌套异常是java.lang.IllegalStateException:bean定义上没有指定bean类

哪里我错了?

1 回答

  • 0

    不确定您使用的是什么版本的 spring 网 . 我看过spring-web.4.x . BufferingClientHttpRequestFactory接受构造函数参数 . 因此,您可以使用constructor-arg创建一个没有工厂bean的bean

    <bean id="bufferingRequestFactory" class="org.springframework.http.client.BufferingClientHttpRequestFactory"/>
        <constructor-arg>
            <ref bean="requestFactory" />
        </constructor-arg>
    </bean>
    

    您可能必须对HttpCompnentsClientHttpRequestFactory执行相同的操作 .

相关问题