2017-02-17 6 views
1

accessExpirationValue 필드 (표준 getter/setter 메소드 사용)를 보유하고있는 특수 CacheConfig 객체 (java.time.Duration)를 사용하고 있습니다. (EDIT : 실제로 필드의 형식은 Long (초 수)이지만 getter와 setter의 길이는 Duration입니다.ConversionServiceFactoryBean이 작동하지 않습니다.

이 값을 Spring으로 연결하려고합니다. 초 수와하는 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)); 
    } 

} 

자, 내가 이해하는 바와 같이,이게 일뿐입니다.입니다. accessExpirationValue 값으로 "0"을 전달할 때 Strings를 Durations로 변환하는 conversionService Bean을 선언했다는 사실은 Duration of zero length로 값을 설정해야 함을 의미합니다.

그러나 이것은 쉽습니다. 그리고 그건.

콩 재산 'accessExpirationValue는'쓸 수 없습니다 또는 잘못된 세터가 있습니다 : 내 응용 프로그램을 (SpringJUnit4ClassRunner 사용) 나는 변환기을 등록하지 않을 것처럼, 내가 ,이 오류가 테스트 할 때 때문에 방법. setter의 매개 변수 유형이 getter의 반환 유형 과 일치합니까?

내 질문은 무엇이 잘못 되었나요? 내가 원하는대로 작동하도록하려면 어떻게해야합니까? 참고로

, 이것은 내가 사용했던 기본 설명서입니다 : https://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert-Spring-config

그것은 구체적으로 말한다

, Spring 애플리케이션에서

, 일반적으로 Spring 컨테이너 당 ConversionService 인스턴스를 구성 (또는 ApplicationContext). 해당 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

봄은 빈의 속성을 클래스에 지정된 getter 및 setter와 일치 시키려고 시도합니다.

getter/setters는 현재 getAccessExpiration()이지만 bean 속성 name = "accessExpirationValue"와 일치하도록 getAccessExpirationValue() 여야합니다. 하나 또는 다른 것을 바꾸면됩니다.

+0

와우 !!!! 나는 내가 그것을 놓쳤다라고 생각할 수 없다!내 이유는 API가 getter 및 setter와 다른 유형이기 때문에 클래스 자체가 아닌 클래스에 필드 이름에 "Value"가 추가 된 이유라고 생각합니다. ApplicationContext를 업데이트했는데 이제 ** 매력이 생겼습니다 !!!! ** 두 번째 눈 인 Hayes에게 감사드립니다! –