在Spring缓存中使用Constructor Arguments:注释驱动

时间:2013-03-22 12:51:08

标签: spring spring-annotations

当我将 cache:annotation-driven 添加到我的应用程序上下文时,我收到以下异常:

Superclass has no null constructors but no arguments were given

我有一个名为 PersistController 的类,其中包含使用 @Cachable(..)注释的方法,我在应用程序上下文中声明了一个实例,如下所示: / p>

<!-- 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>

当我删除缓存:注释驱动的行时,错误消失了,而我收到一个错误,表明带注释的缓存组件不起作用(显然)。这意味着上面声明的 PersistController 被正确声明,Spring完全能够调用正确的构造函数,解析属性,并将字符串作为参数注入。

那么为什么我添加缓存:注释驱动

时出错

我认为这与Spring有关,可以使用 @Cacheable(..)或任何Spring缓存注释自动实例化类的实例。如果是这种情况,我想知道是否有一种方法可以将我的属性指定为构造中的参数。

如果我不能为这些类声明构造函数,(如果你知道答案,我会假设你比我更了解spring-context-flow)将会 @Autowired @Value(..)注释允许生成的类检测属性?

谢谢大家阅读。

1 个答案:

答案 0 :(得分:0)

我找到了问题第二部分的答案,当弹簧使用 cache:annotation-driven <加载类时,是否可以解析 @Value()注释/强>

答案是肯定的,我在 PersistController 中添加了以下行,问题已解决:

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

我仍然不确定是否可以在装有 cache:annotation-driven 的构造函数中提供参数。话虽如此,我会暂时接受这个作为答案并接受一个回答这个问题的答案。