2012-11-27 19 views
11

Mam wiosna @configuration uwagami klasy MappingsClientConfig z dziedziny logicznej jako:Ocenianie wiosna @value adnotacji jako prymitywny logiczna

@Value("${mappings.enabled:true}") 
    private boolean mappingsEnabled; 

Ta klasa jest importowany do innej wiosnę odnotowany klasy tak:

@Configuration 
@Import(MappingsClientConfig.class) 
public class LookupManagerConfig { 

podczas tworzenia klasy za pomocą kontekstu sprężynowego w przypadku testowym, w którym kontener nie może przeanalizować ciągu znaków w polach logicznych mapowania, a otrzymuję:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private boolean com.barcap.tcw.mappings.economic.client.config.EconomicMappingsClientConfig.economicMappingsEnabled; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${mappings.enabled:true}] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282) 
    ... 138 more 
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${mappings.enabled:true}] 
    at org.springframework.beans.SimpleTypeConverter.convertIfNecessary(SimpleTypeConverter.java:61) 
    at org.springframework.beans.SimpleTypeConverter.convertIfNecessary(SimpleTypeConverter.java:43) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:718) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474) 
    ... 140 more 
Caused by: java.lang.IllegalArgumentException: Invalid boolean value [${mappings.enabled:true}] 
    at org.springframework.beans.propertyeditors.CustomBooleanEditor.setAsText(CustomBooleanEditor.java:124) 
    at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:416) 
    at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:388) 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:157) 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:93) 
    at org.springframework.beans.SimpleTypeConverter.convertIfNecessary(SimpleTypeConverter.java:49) 
    ... 144 more 

Jakieś wskazówki dotyczące tego, czego mi brakuje?

+0

Myślę, że problem jest spowodowany faktem, że nie ładujesz pliku właściwości, w którym zdefiniowałeś 'mappings.enabled', ale nie mogę być pewien bez dodatkowych szczegółów. –

Odpowiedz

5

Wygląda na to, że brakuje Ci PropertyPlaceholderConfigurer. Musisz zarejestrować go jako procesor post fabryk fasoli. Teoretycznie można to zrobić tak:

public class PostProcessorConfig { 

    @Bean 
    public BeanFactoryPostProcessor getPP() { 
     PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); 
     configurer.setLocations(new Resource[]{new ClassPathResource("/my.properties")}); 
     return configurer; 
    } 
} 

Jednak nie wydaje się być bug że powoduje problemy robi to od konfiguracji opartej na java. Zobacz bilet na obejścia.

+1

Dodawanie obiektu PropertyPlaceholderConfigurer rozwiązało problem. Ale początkowo, gdy próbowałem zdefiniować nowy PropertyPlaceholderConfigurer, otrzymywałem błędy za brakujące elementy zastępcze, które wcześniej działały bez zarzutu. Tak jakby definicja nowego PropertyPlaceholderConfigurer przesłaniała pewne istniejące zachowanie. Tak więc na razie zdefiniowałem nowy PPC i dodałem wszystkie moje właściwości do jednego załadowanego przez niego pliku właściwości. Pozostaje jednak pytanie, gdzie wcześniej ładowano te właściwości? – 212

1

nawet nie trzeba pliku właściwości, np .:

 
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" /> 

+1

Czy możesz wyjaśnić, gdzie idzie ta linia? W pliku XML LookupManagerConfig? Jeśli dobrze zrozumiałem, czy powinno to być równoważne dodaniu '@Autowired PropertyPlaceholderConfigurer configurer;' w LookupManagerConfig do używania konfiguracji java? – jmmut

+0

@jmmut oczywiście byłoby to applicationContext.xml! – positivecrux

2

Jak to zostało rozwiązane w naszym projekcie, a pozostałe odpowiedzi nie działa dla nas. Używaliśmy także partii sprężystej.

główny config praca:

@Configuration 
@EnableBatchProcessing 
@PropertySource("classpath:application.properties") 
public class MainJobConfiguration { 
    @Autowired 
    PipelineConfig config; 

    @Bean 
    public PipelineConfig pipelineConfig(){ 
     return new PipelineConfig(); 
    } 

    // To resolve ${} in @Value 
    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    // job stuff ... 
} 

właściwości config ładowarka:

public class PipelineConfig { 
    @Value("${option}") 
    private boolean option; 
} 

Uwaga jak @Value jest w PipelineConfig, ale rzeczywiste właściwości, z których rozwiązaniem jest załadowany, jest określony w klasa zawodowa.

0

Jego stary gwint ale jeśli nadal chce wprowadzić wartości dla String użyciu @Value Wiosna adnotacji, to zrobić:

@Value("#{new Boolean('${item.priceFactor}')}") 
private Boolean itemFactorBoolean; 

@Value("#{new Integer('${item.priceFactor}')}") 
private Integer itemFactorInteger; 

pracuje dla mnie na wiosenny buta 1.5.9 Java 8.

Powiązane problemy