giocarmine
giocarmine

Reputation: 580

Spring: use properties read from a file

i'm new to the spring framework and i'm having some problems trying to read and use properties from a file.

To summarize, what i want to do is to define a class which stores all the properties read, a second class that uses those properties to do something and a third class that uses the results.

The class that stores the properties is:

@Configuration
public class PropertyClass {
    @Value("${propertyName")
    private Integer propertyName;

    @Bean(name = "propertyName")
    public Integer getPropertyName() {
        return propertyName;
    }
}

The class that reads and uses those properties:

@Component
public class PropertyReader {
    private Integer myProperty;

    @Autowire
    @Qualifier("propertyName")
    public void setMyProperty(
        Integer myProperty) {
        this.myProperty = myProperty;
    }  

    public Integer getValue() {
        //do something with myProperty
        return result;
    }
}

And the class that uses PropertyReader:

public class Utilizer {
    private PropertyReader getPropertyReader() {
        ApplicationContext context = new AnnotationConfigApplicationContext(PropertyReader.class);
        PropertyReader reader = (BakerStorageClassConfigHelper)context.getBean("PropertyReader");
        return reader;
    }
}

I've registered the classes as beans in the application-config.xml file:

<bean class="property.class.package.PropertyClass" depends-on="Environment" />
<bean class="reader.class.package.PropertyReader" />

And i have an environment.xml file where the "Environment" bean is defined with location rules to find the property files.

Now what happens that in the class "Utilizer" when i try to get the "ApplicationContext" object an exception is thrown:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'PropertyReader': 
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire method: public void reader.class.package.PropertyReader.setMyProperty(java.lang.Integer); 
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.Integer] 
found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

I've tried to change the annotation of PropertyReader class to @Repository or @Service and tried to add a @ComponentScan with the PropertyClass package specified but none of that worked for me..

Could someone give me some advices?
Thank you!

Upvotes: 0

Views: 209

Answers (1)

LeOn - Han Li
LeOn - Han Li

Reputation: 10194

I do not quite get why do you need to declare propertyName as Integer. If what you need is just get the properties from file, then you can define a PropertiesFactoryBean and autowire it to any other beans you like.

Let's say you have a myValues.properties file containing values:

key1=value1
key2=value2 

Define Bean:

@Bean(name = "myProperties")
public PropertiesFactoryBean detailQueriesFactoryBean()
{
    PropertiesFactoryBean pfb = new PropertiesFactoryBean();
    pfb.setLocation(new ClassPathResource("com/xxx/myValues.properties"));
    return pfb;
}

Now wherever you need it, do:

@Autowired
@Qualifier("myProperties")
private Properties myValuesContainer;

public void myMethod(){
  //this will get you "value1"
  String value1 = myValuesContainer.getProperty("key1");
}

Hope this works for you.

--------------------- For your case----------------

If it is already in the application context, you can use @Value to inject value directly in your PropertyReader and add getter/setter for them. No need a PropertyClass, right?

Or you can add a @PostConstruct method to PropertyReader. Inside the method, you can retrieve the values you need from the existing context.

@PostContstruct
public void extractValues(){
    //retrieve value from context and assign to whichever var.
} 

Upvotes: 1

Related Questions