Невозможно внедрить конфигурацию в обычные служебные классы Play Framework 2.5.x

#java #playframework

#java #playframework

Вопрос:

Я не могу внедрить конфигурацию в обычные служебные классы, она отлично работает в классе контроллера.

@Inject Configuration конфигурация

 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"); 
    } 
}
  

На самом деле я хочу удалить устаревший Play.application() и хочу использовать Configuration для этого, я хочу внедрить конфигурацию в этот класс.

Комментарии:

1. Пожалуйста, расскажите немного подробнее, как именно выглядит ваш служебный класс

2. общедоступный класс EmailService { общедоступная статическая логическая почта отправки (конечный AppUser AppUser, конечная строка mailString, строка subject) { конечные свойства props = новые свойства (); конечная строка auth = Play.application().configuration().getString(«mail.smtp.auth»); конечная строка starttls = Play.application().configuration().getString(«mail.smtp.starttls.enable»); } На самом деле я хочу удалить устаревший Play.application() и хочу использовать Configuration для этого Я хочу внедрить конфигурацию в этот класс

Ответ №1:

Фреймворки внедрения зависимостей вводят зависимости при создании экземпляров объектов, поэтому, если вы хотите, чтобы метод использовал внедренный компонент, он должен быть нестатическим.

Вы хотите сделать что-то подобное, сделав ваш метод 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");
    }
}
  

Затем внедрите EmailService экземпляр в конструкторы вашего контроллера.

Примечание: это используется @ImplementedBy для простоты, но вы также можете настроить привязку в своем модуле Guice, что позволит вам имитировать ее в тестах.