当我将 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(..)注释允许生成的类检测属性?
谢谢大家阅读。
答案 0 :(得分:0)
我找到了问题第二部分的答案,当弹簧使用 cache:annotation-driven <加载类时,是否可以解析 @Value()注释/强>
答案是肯定的,我在 PersistController 中添加了以下行,问题已解决:
@Value("${cache.currentVersionPostfix}")
private String keyPostfix;
我仍然不确定是否可以在装有 cache:annotation-driven 的构造函数中提供参数。话虽如此,我会暂时接受这个作为答案并接受一个回答这个问题的答案。