2017-02-17 14 views
1

Я работаю со специальным объектом 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(); 
    } 
} 

ответ

1

Весна попытается сопоставить свойства в вашем компоненте с геттерами и сеттерами, указанными в вашем классе.

Ваши геттеры/сеттеры в настоящее время getAccessExpiration(), но должны быть getAccessExpirationValue(), чтобы соответствовать вашему имени свойства bean = "accessExpirationValue". Измените одно или другое, и вы должны иметь его.

+0

Wow !!!! Не могу поверить, что я пропустил это!Я думаю, что причина, по которой класс (который не является моим собственным) имеет значение «Значение», добавленное к имени поля, состоит в том, что он отличается от API-получателя и сеттера. Я обновил ApplicationContext, и теперь он РАБОТАЕТ КАК ОЧАРОВАТЬ !!!! ** Спасибо за то, что он второй парой глаз, Хейс! –

 Смежные вопросы

  • Нет связанных вопросов^_^