我正在使用一个特殊的CacheConfig对象,该对象包含一个字段(使用标准的getter / setter方法)accessExpirationValue
,其类型为java.time.Duration
。 (编辑:实际上,该字段的类型为Long(秒数),但getter和setter的类型为Duration。)
我试图通过将此值设置为秒数并使用ConversionServiceFactoryBean来在Spring中连接它,如下所示:
ApplicationContext.xml中的相关bean:
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean" >
<property name="converters">
<set>
<bean
class="com.tjamesboone.example.config.SecondsToDurationConverter"/>
</set>
</property>
</bean>
<bean id="cacheConfig" class="com.tjamesboone.example.cache.CacheConfig" >
<property name="accessExpirationValue" value="0" />
</bean>
SecondsToDurationConverter:
package com.tjamesboone.example.cache;
import java.time.Duration;
import org.springframework.core.convert.converter.Converter;
public class SecondsToDurationConverter implements Converter<String, Duration> {
@Override
public Duration convert(String seconds) {
return Duration.ofSeconds(Long.parseLong(seconds));
}
}
现在,据我了解,这应该是 正常工作 。当我传入&#34; 0&#34;对于accessExpirationValue
的值,我已经声明了一个处理将字符串转换为持续时间的conversionService bean的事实意味着应该将值设置为持续时间为零长度。
但这很容易。它是。因为当我测试我的应用程序时(使用SpringJUnit4ClassRunner),我收到此错误, 就好像我从未注册过转换器 :
Bean属性&#39; accessExpirationValue&#39;不可写或有 无效的setter方法。 setter的参数类型是否匹配 getter的返回类型?
所以我的问题是,我做错了什么?我如何按照我想要的方式让它工作?
供参考,这是我一直使用的主要文件: 的 https://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert-Spring-config
具体说,
在Spring应用程序中,通常为每个Spring容器(或ApplicationContext)配置一个ConversionService实例。那个ConversionService将被Spring选中,然后在框架需要执行类型转换时使用。
修改 我可能还应该发布CacheConfig的相关部分!
package com.tjamesboone.example.config;
import java.time.Duration;
public class CacheConfig {
private Long accessExpirationValue;
public Duration getAccessExpiration() {
return Duration.ofSeconds(accessExpirationValue.intValue);
}
public void setAccessExpiration() {
this.accessExpirationValue = expirationDuration.getSeconds();
}
}
答案 0 :(得分:2)
Spring将尝试将bean中的属性与类中指定的getter和setter匹配。
您的getter / setter目前是getAccessExpiration(),但应该是getAccessExpirationValue()以匹配您的bean属性name =“accessExpirationValue”。改变一个或另一个你应该拥有它。