1

私は現在、レストサービスを構築するために resteasy をいじっていますが、デフォルトの connectionManager(SimpleHttpConnectionManager) では、長時間実行されるトランザクション メソッドで 1 つの接続しか維持できません。そこで、MultiThreadedHttpConnectionManager で Bean を初期化しようとしました

私のポン:

<properties>
    <resteasy.version>2.1.0.GA</resteasy.version>
    <spring.version>3.0.5.RELEASE</spring.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>3.0.5.RELEASE</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.0.5.RELEASE</version>
        <scope>provided</scope>
    </dependency>
<dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-spring</artifactId>
        <version>${resteasy.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson-provider</artifactId>
        <version>${resteasy.version}</version>
        <scope>provided</scope>
    </dependency>

私のapplicationContext.xml

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
    <constructor-arg>
        <bean class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"
            p:maxConnectionsPerHost="10"
            p:maxTotalConnections="20"/>
    </constructor-arg>
</bean>
<bean id="myRestService"
    class="org.jboss.resteasy.client.spring.RestClientProxyFactoryBean"
    p:serviceInterface="com.me.service.myRestService"
    p:baseUri="${serviceNameUrl}" 
    p:httpClient-ref="restHttpClient"/>

しかし、jboss 6 サーバーを起動すると、次の例外が発生しました。

09:37:44,774 ERROR [ContextLoader] Context initialization failed: org.springframework.beans.factory.BeanCreationException:nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.me.service.myRestService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Related cause: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'myRestService' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: 
Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: 
Failed to convert property value of type 'org.apache.commons.httpclient.HttpClient' to required type 'org.apache.commons.httpclient.HttpClient' for property 'httpClient'; 
nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.apache.commons.httpclient.HttpClient] to required type [org.apache.commons.httpclient.HttpClient] for property 'httpClient': 
no matching editors or conversion strategy found    

resteasy パッケージの依存バージョンを検索しようとしています。ただし、必要な commons-httpclient は同じです (バージョン 3.1)。では、「HttpClient」が「HttpClient」に変換できないのはなぜですか?

4

1 に答える 1

1

最後にこれを機能させます。問題は、サードパーティの依存関係を追加することです:

    <dependency>
     <groupId>net.java.dev.jets3t</groupId>
     <artifactId>jets3t</artifactId>
      <version>0.8.0</version>
</dependency>

しかし、私は指定しませんでした:

    <scope>provided</scope>

これにより、commons-httpclient-3.1.jar が最終的な war ファイルに準拠するようになります。

同時に、commons-httpclient-3.1.jar を {jboss_home}/server/default/lib ディレクトリに追加します。そのため、jboss クラスローダは起動時に httpclient をロードし、これらの Bean をロードすると、パッケージから httpclient がロードされ、上記の例外が発生します。

したがって、これらのサードパーティの依存関係に常に注意してください。同じオブジェクトから同じオブジェクトに変換できない例外の 90% は、この重複ローダーの問題が原因であると思います。

于 2012-07-27T00:27:27.500 に答える