2015-03-25 4 views
-1

Я использую Spring для инъекции зависимостей, поэтому у меня есть класс, который использует swing для пользовательского интерфейса, однако, когда я хочу использовать @Autowired для любых объектов swing, я получаю NullPointerException.Spring Autowired Swing objects NullPointerException

Вот класс:

@Component 
public class PanelImpl implements Panel { 

    @Autowired 
    @Qualifier("getJPanel") 
    private JPanel panel; 

    //@Autowired 
    private JButton getInfoBtn = new JButton(); 

    public PanelImpl() { 
     init(); 
    } 

    private void init() { 
     setPanel(); 
    } 

    private void setPanel() { 
     getInfoBtn.setText("Get Info"); 
     panel.add(getInfoBtn); 
    } 

    @Override 
    public JPanel getPanel() { 
     return panel; 
    } 
} 

А вот класс конфигурации:

@Configuration 
@ComponentScan("ooc") 
@PropertySource("app.properties") 
public class SpringConfiguration { 

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

    @Bean 
    public Panel getPanel() { 
     Panel PanelImpl = new PanelImpl(); 
     return PanelImpl; 
    } 


    @Bean 
    public JPanel getJPanel(){ 
     return new JPanel(); 
    } 

} 

Поэтому любые предложения, как я могу использовать весной для инъекций свинг объектов? Спасибо заранее.

ответ

0

Использование @PostConstruct решило мою проблему. Он обеспечит ввод всех зависимостей перед выполнением метода.

@Component 
public class PanelImpl implements Panel { 

    @Autowired 
    private JPanel panel; 

    @Autowired 
    private JButton getInfoBtn; 

    @PostConstruct 
    private void setPanel() { 
     getInfoBtn.setText("Get Info"); 
     panel.add(getInfoBtn); 
    } 

    @Override 
    public JPanel getPanel() { 
     return panel; 
    } 
} 
+0

Позаботьтесь, чтобы не злоупотреблять '@ Autowired' - это легко приводит к недостижимому беспорядку. См. Например, http://stackoverflow.com/questions/29260676. Даже ссылка Spring ссылается на '@ Autowired': см. Таблицу 5.2 на http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-autowire –

+0

@VictorSorokin, спасибо за ваш комментарий. Итак, что вы предлагаете для того, чтобы не использовать «@ Autowired»? – secret

+1

Используйте явные зависимости - через конструктор или через сеттеры. Это требует больше нажатий клавиш, но у вас гораздо более четкая база кода, и вы тестируете модуль без Spring (так как вы можете передавать зависимости от кода тестового кода к вашим объектам). –

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