Khaleesi
Khaleesi

Reputation: 469

Spring Property Injection with Play2 Framework

I like many features of Play Framework 2 (I'm using it with Java) but, as a fan of Dependency Injection, I love also Spring and particularly, its way to inject configuration into objects by just using the @Value annotation.

Therefore, I would love to know how to inject into an instance variable the value of a property using Play's built-in property resolution mechanism. Something like this:

@Component
public class SpringBeanWithinAPlay2Application {

   @Value("${application.timeout:10}")
   private int timeout;
}

Any clue anyone? Many thanks in advance.

Upvotes: 1

Views: 413

Answers (1)

Clint Eastwood
Clint Eastwood

Reputation: 5698

I had the same problem a while ago and this was my way of making this work:

Firstly, when you boostrap your Spring Application context (I use annotation based configuration but the same should work for XML based), you have to add a custom PropertySource, which is the way Spring enables the addition of new way of resolving properties. Something like this:

public static void initialize() {
    ctx = new AnnotationConfigApplicationContext();
    ctx.getEnvironment().getPropertySources().addFirst(new PlayFrameworkPropertySource());
    ctx.scan("somepackage");
    ctx.refresh();
}

The custom class PlayFrameworkPropertySource is the one that does the magic:

public class PlayFrameworkPropertySource extends PropertySource<Object> {

    public PlayFrameworkPropertySource() {
        super("Play Framework properties resolution mechanism");
    }

    @Override
    public Object getProperty(String propertyName) {
        // or ConfigFactory.load().getString(propertyName), as you prefer...
        return Configuration.root().getString(propertyName);
    }
}

In order for all this to work, you just need to do one more thing: explicitly declare a bean of type PropertySourcesPlaceholderConfigurer in some @Configuration class you might be using:

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

Important Note: this bean must be static, as it's a BeanFactoryPostProcessor and it should be loaded prior to any other regular @Bean.

This worked like a charm for me, hope this is helpful to someone else!

Cheers,
Jonathan

Upvotes: 2

Related Questions