简体   繁体   English

无法在普通实用程序类中注入配置Play Framework 2.5.x

[英]Unable to Inject Configuration in normal utility classes Play Framework 2.5.x

I am unable to Inject Configuration in normal utility classes ,it works fine in controller class. 我无法在普通实用程序类中注入配置,在控制器类中可以正常工作。

@Inject Configuration configuration @Inject配置配置

public class EmailService { 
    public static boolean sendEmail(final AppUser appUser,final String mailString,String subject) { 
        final Properties props = new Properties(); 
        final String auth = Play.application().configuration().getString("mail.smtp.auth‌​")
        final String starttls = Play.application().configuration().getString("mail.smtp.star‌​ttls.enable"); 
    } 
}

Actually I want to remove Depricated Play.application() and want to use Configuration for that I want to Inject Configuration in this class. 实际上,我想删除Depricated Play.application()并想使用Configuration来在该类中注入Configuration。

Dependency injection frameworks inject dependencies when constructing instances of objects, so if you want a method to use an injected component it has to be non-static. 依赖注入框架在构造对象实例时注入依赖,因此,如果要使用插入组件的方法,它必须是非静态的。

You want to do something like this, making your sendEmail method non-static, and providing an interface: 您想要执行以下操作,使sendEmail方法为非静态方法,并提供一个接口:

@ImplementedBy(EmailServiceImpl.class)
public interface EmailService {
    void sendEmail(AppUser appUser, String mailString, String subject);
}

@Singleton
public class EmailServiceImpl implements EmailService {
    private final Configuration config;

    @Inject
    public EmailServiceImpl(Configuration config) {
        this.config = config;
    }

    public void sendEmail(AppUser appUser, String mailString, String subject) {
        final Properties props = new Properties(); 
        final String auth = config.getString("mail.smtp.auth‌​")
        final String starttls = config.getString("mail.smtp.star‌​ttls.enable");
    }
}

Then inject an EmailService instance into your controller constructors. 然后将EmailService实例注入到您的控制器构造函数中。

Note: this uses @ImplementedBy for simplicity but you could also configure the binding in your Guice module, allowing you to mock it in tests. 注意:为简单起见,这里使用@ImplementedBy ,但您也可以在Guice模块中配置绑定,从而允许在测试中模拟它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM