Я работаю со специальным объектом CacheConfig, который содержит поле (со стандартными методами getter/setter), accessExpirationValue
, которое имеет тип java.time.Duration
. (EDIT: на самом деле, поле типа Long (количество секунд), но и геттер сеттер имеют тип Duration.)ConversionServiceFactoryBean не работает
Я пытаюсь подключить это весной, установив это значение в качестве количество секунд, и используя ConversionServiceFactoryBean, например, так:
Соответствующие бобы в applicationContext.xml:
<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));
}
}
Теперь, как я понимаю, это должно быть просто работа. Когда я перехожу в «0» для значения accessExpirationValue
, тот факт, что я объявил beanConvertService, который обрабатывает преобразование строк в значения Durations, означает, что это значение должно быть задано как длительность нулевой длины.
Но это было бы легко. И это. Потому что, когда я проверить мое приложение (используя SpringJUnit4ClassRunner), я получаю эту ошибку, , как если бы я никогда не регистрировал конвертер:
Bean свойство «accessExpirationValue» не доступен для записи или имеет недопустимый сеттер метод. Указывает ли тип параметра сеттера тип возврата получателя?
Так что мой вопрос: Что я делаю неправильно? Как мне заставить это работать так, как я хочу?
Для справки, это первичная документация, я использую: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert-Spring-config
Он, в частности, говорит,
В приложении Spring, вы, как правило, настроить экземпляр ConversionService за Спринг контейнер (или ApplicationContext). Этот ConversionService будет выбран весной, а затем использоваться всякий раз, когда преобразование типа должно выполняться каркасом.
EDIT: я, вероятно, следует также разместить соответствующую часть 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();
}
}
Wow !!!! Не могу поверить, что я пропустил это!Я думаю, что причина, по которой класс (который не является моим собственным) имеет значение «Значение», добавленное к имени поля, состоит в том, что он отличается от API-получателя и сеттера. Я обновил ApplicationContext, и теперь он РАБОТАЕТ КАК ОЧАРОВАТЬ !!!! ** Спасибо за то, что он второй парой глаз, Хейс! –