2

アプリケーションコンテキストにcache:annotation-drivenを追加すると、次の例外が発生します。

Superclass has no null constructors but no arguments were given

@Cachable(..)で注釈が付けられたメソッドを持つPersistControllerというクラスがあり、アプリケーションコンテキスト内で次のようにインスタンスを宣言しています。

<!-- The culprit, for whatever reason -->
<cache:annotation-driven />

<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
    <property name="caches">
        <set>
            <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="primaryTest"/>
            <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="secondaryTest"/>
        </set>
    </property>
</bean>

<!-- The problem began when I started requiring a String in the constructor. -->
<bean id="persistController" class="com.sei.poc.controller.PersistController" >
    <constructor-arg> <value>${cache.nextVersionPostfix}</value></constructor-arg>  
</bean>

cache:annotation-driven行を削除すると、エラーはなくなり、代わりに、注釈付きのキャッシュコンポーネントが機能していないことを示すエラーが表示されます(明らかに)。これは、上記で宣言されたPersistControllerが適切に宣言され、Springが適切なコンストラクターを呼び出し、プロパティを解決し、引数として文字列を挿入できることを意味します。

では、なぜcache:annotation-drivenを追加したときにエラーが発生するのでしょうか。

これは、Springが@Cacheable(..)またはSpringキャッシュアノテーションのいずれかを使用してクラスのインスタンスを自動的にインスタンス化することと関係があると思います。もしそうなら、私は自分のプロパティをその構築の引数として指定できる方法があるかどうか知りたいです。

これらのクラスのコンストラクターを宣言できない場合(そして答えを知っている場合は、私よりもSpring-context-flowをよく理解していると思います)@Autowiredまたは@Value(..)アノテーションにより、生成されたクラスが検出できるようになりますプロパティ?

読んでくれてありがとう。

4

1 に答える 1

0

春にcache:annotation-drivenでクラスをロードしたときに@Value()アノテーションが解決されるかどうかにかかわらず、質問の2番目の部分に対する答えを見つけました。

答えはイエスです。PersistControllerに次の行を追加したところ、問題は解決されました。

@Value("${cache.currentVersionPostfix}")
private String keyPostfix;

cache:annotation-drivenをロードしたコンストラクターで引数を指定できるかどうかはまだわかりません。そうは言っても、私はこれを答えとして受け入れるのを保留し、その質問に答えるものを受け入れます.

于 2013-03-25T12:04:59.797 に答える