2017-06-15 141 views
0

我在独立的Java应用程序中遇到问题。问题是我尝试Autowire我的服务和我的DAO,但当我从UI调用服务方法,因为依赖注入无法正常工作,我得到一个NullPointerException。我尝试了很多东西,其中许多来自类似的问题,但问题仍然存在。我正在使用Spring 4.0.6.RELEASE和Hibernate 4.3.11.Final。这里是我的代码:弹簧依赖注入不起作用

1 - 服务的调用:

public class LoginView { 

    @Autowired 
    private UsuarioService usuarioService; 
    ... 
    ... 
    JButton btnAutenticarse = new JButton("Autenticar"); 
    btnAutenticarse.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      try { 
       Usuario usuario = usuarioService.login(textField.getText(), 
         String.valueOf(passwordField.getPassword()), false); // NullPointerException 

      } catch (InstanceNotFoundException e1) { 
    ... 

2 - 服务的定义:

@Service("usuarioService") 
public class UsuarioServiceImpl implements UsuarioService { 

    @Autowired 
    private UsuarioDao usuarioDao; 
    ... 

3 - DAO的定义:

@Repository("usuarioDao") 
public class UsuarioDaoHibernate extends GenericDaoHibernate <Usuario, Long> 
    implements UsuarioDao { 
    ... 

4 - GenericDAO的定义:

public class GenericDaoHibernate<E, PK extends Serializable> implements 
    GenericDao<E, PK> { 

@Autowired 
private SessionFactory sessionFactory; 
.... 

5 - AppConfig.java

@Configuration 
@ComponentScan(basePackages = "org.example.model") 
public class AppConfig { 

@Bean(name = "usuarioService") 
public UsuarioService usuarioService() { 
    return new UsuarioServiceImpl(); 
} 

@Bean(name = "usuarioDao") 
public UsuarioDao usuarioDao() { 
    return new UsuarioDaoHibernate(); 
} 

6 - spring-config.xml:春

<!-- Enable usage of @Autowired. --> 
<context:annotation-config/> 

<!-- Enable component scanning for defining beans with annotations. --> 
<context:component-scan base-package="org.example.model"/> 

<!-- For translating native persistence exceptions to Spring's 
     DataAccessException hierarchy. --> 
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/appdb" /> 
    <property name="username" value="username" /> 
    <property name="password" value="password"/> 
</bean> 

<bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy" 
    p:targetDataSource-ref="dataSource"/> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" > 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan"> 
     <list> 
      <value>org.example.model</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.format_sql">false</prop> 
     </props> 
    </property>  
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<bean id="persistenceExceptionTranslationPostProcessor" 
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

<!-- Enable the configuration of transactional behavior based on 
    annotations. --> 
<tx:annotation-driven transaction-manager="transactionManager" /> 
+0

你如何创建'LoginView'? – Reimeus

+0

这是来自另一个包org.example.view的Swing类。它有一个构造函数'LoginView()',它调用一个名为'initialize'的方法,其中包含引发'NullPointerException'的代码部分。 – clanofsol

+0

我认为问题的关键是如果你是用'new'实例化'LoginView'还是让Spring创建'LoginView'。如果你使用'new',Spring将不会注入这些字段。 –

回答

0

春天才会注入自动连接的字段管理的Bean。又如果你使用的是new LoginView() Spring不能注入依赖关系。

public class LoginView { 

    @Autowired 
    private UsuarioService usuarioService; 
} 

应该

@Component 
public class LoginView { 

    @Autowired 
    private UsuarioService usuarioService; 
} 

如果你不能让Spring来管理这个类,你需要设计一个不同的方式。

顺便说一句,我建议你使用构造函数注入而不是字段注入。

我可以做什么是再拍类是Spring管理bean并做这样的事情:

@Component 
public class InitClass{ 

    private UsarioService usarioService; 

    @Autowired 
    public InitClass(UsarioService usarioService){ 
    this.usarioService = usarioService; 
    }   

    @PostConstruct 
    public void init(){ 
    new LoginView(usarioService); 
    }   
} 

那么这个类将处理所有的初始化你在@PostConstruct现在做的事情。可能需要在@PostConstruct中执行此操作,因为直到那时Spring bean才可能完全初始化。

但是,如果没有看到每件事情是如何初始化的,就很难说最好的策略是什么。