ConversionServiceFactoryBean不起作用

时间:2017-02-17 01:43:20

标签: java spring applicationcontext

我正在使用一个特殊的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();
  }
}

1 个答案:

答案 0 :(得分:2)

Spring将尝试将bean中的属性与类中指定的getter和setter匹配。

您的getter / setter目前是getAccessExpiration(),但应该是getAccessExpirationValue()以匹配您的bean属性name =“accessExpirationValue”。改变一个或另一个你应该拥有它。