【问题标题】:Mybatis with Spring NullPointerException Autowired fieldMybatis with Spring NullPointerException Autowired 字段
【发布时间】:2015-05-10 01:52:24
【问题描述】:

我正在尝试将 Mybatis 与 Spring 集成。这里可以看到我的Spring应用上下文

<context:annotation-config /> 

<context:component-scan base-package="com" />

<tx:annotation-driven />  

<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/DB" />  
    <property name="username" value="root" />  
    <property name="password" value="" />  
</bean> 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:/com/mybatis/mybatis-config.xml" />
    <!--<property name="transactionFactory" ref="springManagedTransactionFactory" />-->
</bean>

<!--
<bean id="springManagedTransactionFactory" class="org.mybatis.spring.transaction.SpringManagedTransactionFactory">  
    <constructor-arg index="0" ref="dataSource" />  
</bean> -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="registroClimaMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
    <property name="mapperInterface" value="com.mybatis.dao.RegistroClimaMapper" />  
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />  
</bean> 

首先我在 XML 中注释了 springManagedTransactionFactory 因为它给了我一个例外

Error creating bean with name 'springManagedTransactionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)

这是我的界面 RegistroClimaMapper。我这里没有任何注释,因为我已经定义了上下文:组件扫描。

public interface RegistroClimaMapper {

  void insertarRegistroClima(RegistroClima registro) throws SQLException;

  List<RegistroClima> getRegistrosClima() throws SQLException;

  List<RegistroClima> getRegistrosClima(@Param("Validado") boolean Validado) throws SQLException;

}

我尝试在 ManagedBean 中使用此接口,当我要在 TablaRegistroClimaBean 的方法中使用 registroClimaPersistence 时,我得到一个 NullPointerException

@ManagedBean(name = "tablaRegClimaBean")
@ViewScoped
public class TablaRegistroClimaBean implements Serializable {

  @Autowired
  private RegistroClimaMapper registroClimaPersistence;

  public void setRegistroClimaPersistence(RegistroClimaMapper registroClimaPersistence) {
    this.registroClimaPersistence = registroClimaPersistence;
  }
}

【问题讨论】:

  • 你得到了什么NullPointerException?你有没有实现RegistroClimaMapper 接口的Bean?因为仅仅定义一个接口是不够的。 ;)

标签: java spring dependency-injection mybatis autowired


【解决方案1】:

如此处所示:http://javadox.com/org.mybatis/mybatis-spring/1.1.1/org/mybatis/spring/transaction/SpringManagedTransactionFactory.html#SpringManagedTransactionFactory%28%29,SpringManagedTransactionFactory 有一个默认构造函数,但没有一个采用数据源。您需要将数据源传递给 newTransaction() 方法,而不是构造函数:http://javadox.com/org.mybatis/mybatis-spring/1.1.1/org/mybatis/spring/transaction/SpringManagedTransactionFactory.html#newTransaction(javax.sql.DataSource,%20org.apache.ibatis.session.TransactionIsolationLevel,%20boolean)

把这段代码改成

<bean id="springManagedTransactionFactory" class="org.mybatis.spring.transaction.SpringManagedTransactionFactory">  
  <!--<constructor-arg index="0" ref="dataSource" />-->
</bean>

或完全删除constructor-arg。

你得到了什么NullPointerException?它可能来自您只是定义RegistroClimaMapper 接口,而不是在任何bean 中实现这个接口。请添加一个实现此接口的 Bean,Autowired 注释应该可以工作。

【讨论】:

  • 我在使用 registroClimaPersistence 对象的方法中的 TablaRegistrosClima bean 中得到 NullPointerException。如何解决 springManagedTransactionFactory 的问题?你说我它有一个带有一个参数的构造函数,在我的 xml 中我指定了 dataSource 参数
  • 能否添加堆栈跟踪和发生异常的相应代码行?
  • 我有一个类实现了这个接口,但是在和spring集成之前是用Mybatis完成的。我在使用mybatis和spring时没有看到任何接口实现的例子。能不能给我看一个关于mybatis with spring的好教程?
  • 我对 mybatis 一无所知,但是上面的修复(注释掉构造函数参数,而不是整个 bean)应该可以修复你的 NPE
  • 抱歉我的问题,但我是从春天开始的,我对某些事情一无所知。我不太确定是否必须将@component 放在我想要注入的类上,或者它是否足以使用 context:component scan ... 或类似的东西。
猜你喜欢
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
相关资源
最近更新 更多