2015-12-20 4 views
0

Когда я добавляю свойство в файлы application.properties, это может быть доступ из основного класса без каких-либо проблем.Чтение application.properties из любого класса весенней загрузки

@SpringBootApplication 
    @ComponentScan(basePackages = "com.example.*") 
    public class MailTestApplication implements CommandLineRunner { 

     @Value("${admin.mail}") 
     String email; 

     public static void main(String[] args) { 
      SpringApplication.run(MailTestApplication.class, args); 
     } 

     @Override 
     public void run(String... strings) throws Exception { 

      System.out.println(email); 
      Email email = new Email(); 
      email.sendMail(); 
     } 
    } 

Однако, когда я пытаюсь получить к нему доступ из любого другого класса, он никогда не извлекается.

@Component 
    public class Email { 

     @Autowired 
     private MailSender sender; 

     @Value("${admin.mail}") 
     String email; 

     public Email() { 
     } 

     public void sendMail() { 
      SimpleMailMessage msg = new SimpleMailMessage(); 

      System.out.println(email); 

      msg.setTo("[email protected]"); 
      msg.setSubject("Send mail by Spring Boot"); 
      msg.setText("Send mail by Spring Boot"); 

      sender.send(msg); 
     } 
    } 

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

Может ли кто-нибудь дать мне какие-либо сведения об этом?

Большое спасибо.

+0

Если вы обнаружили ошибку. Вставьте здесь стек. – harshavmb

+0

Нет ошибки при чтении собственности. Проблема заключается в том, что значение всегда равно null, когда я пытаюсь прочитать его из любого класса, который не является основным. –

+0

Я не знаком с весенним ботинком.Я подозреваю, что это может быть проблема объема или зависимости. Я бы предложил вам получить это свойство в основном классе, сохранить в переменной-члене, создать геттеры и сеттеры и попытаться получить доступ к методам getter из других классов, введя экземпляр основного класса. Этот подход будет лучше, поскольку вы не будете повторно обращаться к файлу свойств. – harshavmb

ответ

1

@value должен работать (Im asuming вашего класса находится под com.example * пакет, так как вы сканируете этот пакет.), Но если вы хотите сделать это по-другому, это то, что им с помощью:

public class JpaConfiguration { 

    public static final String TRANSACTION_MANAGER_NAME = "jpaTransactionManager"; 

    @Autowired 
    Environment applicationProperties; 

Затем использовать его

@Bean 
    public DriverManagerDataSource driverManagerDataSource() { 
     DriverManagerDataSource driverConfig = new DriverManagerDataSource(); 

     driverConfig.setDriverClassName(applicationProperties.getProperty("data.jpa.driverClass")); 
     driverConfig.setUrl(applicationProperties 
       .getProperty("data.jpa.connection.url")); 
     driverConfig.setUsername(applicationProperties 
       .getProperty("data.jpa.username")); 
     driverConfig.setPassword(applicationProperties 
       .getProperty("data.jpa.password")); 

     return driverConfig; 
    } 

UPDATE после получения GitHub репо

Я не знаю, что вы пытаетесь построить, но:

Если вы сделаете это:

@Override 
    public void run(String... strings) throws Exception { 

     //System.out.println(email); 
     Email email = new Email(); 
     email.sendMail(); 
    } 

Затем вы создаете экземпляр класса, а не весной. поэтому вы не должны создавать экземпляр самостоятельно там, где должно быть весна. Тем не менее, я не знаю, создаете ли вы веб-приложение приложение командной строки или и то, и другое.

Это говорит, что плохо дать вам небольшое решение, чтобы показать вам, что инъекция зависимости фактически работает.

1_ добавить геттер на ваш адрес электронной почты в классе электронной почты. удалите интерфейс CommandLine (если вы хотите реализовать это, я бы посоветовал вам поместить функции CommandLine в другой пакет, например Controller);

А затем запустить приложение, как это:

@SpringBootApplication 
@ComponentScan(basePackages = "com.example") 
public class MailTestApplication { 

    @Value("${admin.mail}") 
    String email; 

    public static void main(String[] args) { 
     // SpringApplication.run(MailTestApplication.class, args); 

     final ConfigurableApplicationContext context = new SpringApplicationBuilder(MailTestApplication.class).run(args); 

     Email e = context.getBean(Email.class); 
     System.out.println(e.getEmail()); 
    } 

Ключ, что я хочу показать, что экземпляр создается при помощи пружинных Вот почему жгуты работ. и электронная почта печатается в консоли. Что касается класса электронной почты:

@Component 
public class Email { 

// @Autowired 
    // private MailSender sender; 

    @Value("${admin.mail}") 
    String email; 

    public Email() { 
    } 

    public void sendMail() { 
     SimpleMailMessage msg = new SimpleMailMessage(); 

     System.out.println(email); 

     msg.setTo("[email protected]"); 
     msg.setSubject("Send mail by Spring Boot"); 
     msg.setText("Send mail by Spring Boot"); 

     // sender.send(msg); 
    } 

    public String getEmail() { 
     return email; 
    } 


} 

Я Закомментируйте MailSender, так как я думаю, что вам нужно настроить, что тоже, я сделал пользовательский MailSender, который использует Gmail и другие для Mailchimp, что я могу поделиться с вами, если вам нужно , но опять же я не знаю, каковы ваши намерения с приложением.

Надеемся, что информация вам поможет.

+0

Спасибо @Sudakatux за ваш ответ. В моем случае оба находятся в одном пакете и все еще не работают. В случае, если они находятся в разных пакетах, я предполагаю, что добавление ComponentScan (basePackages = "com.example. *") Должно быть достаточно, если я сначала сделаю его работу в одном пакете. –

+0

Хорошо, но ваш mailSenderService фактически вводится правильно? – jstuartmilne

+0

Ни то, ни другое! MailSender также является нулевым. Я думаю, это по той же причине. –

Смежные вопросы