Mybatis報錯:Mapped Statements collection does not contain value for x包.x類.x方法
錯誤資訊:
### Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.task.dao.ProductDao.selectByUserId
網上尋找原因:對應的Mapper映射檔案沒有被成功掃描到
-
命名空間沒有設定對或映射檔案名和對應介面名不一致
<!--命名空間沒問題-->
<mapper namespace="com.task.dao.ProductDao">
<!--映射檔案名和對應介面名也一致--> -
對應spring組態檔中的mybatis配置沒有設定對
<!--配置掃描也沒問題-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value=https://www.cnblogs.com/rismer/p/"com.task.dao" />
</bean> -
maven編譯后,target目錄下沒有生成對應的Mapper映射檔案
//對應target目錄下也存在對應的Mapper映射檔案
分析:
由于第一次使用spring中的ApplicationContextAware介面,并且這些方法都是在這里面執行的時候報錯的,有可能是這里面的原因,
下面是實作ApplicationContextAware介面的類
public class StaticPageLoader implements ApplicationContextAware {
@Autowired
private InitService initService;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
init();
}
public void init() {
//這個會去呼叫對應UserDao
initService.init();
}
}
對應InitService中的方法
public class InitServiceImpl implements InitService {
@Autowired
private UserDao userDao;
...
public void init() {
...
userDao.selectDetailById();
...
}
...
}
對應的Mapper映射檔案
<!--會將查詢的結果映射到下面的resultMap中-->
<select id="selectDetailById" resultMap="selectDetailByIdResultMap">
SELECT * FROM t_user WHERE `id`=#{id}
</select>
?
<!--這里面有個select,會呼叫ProductDao.selectByUserId中的方法去查詢-->
<!--報錯就出在這里,但是對應的Dao和映射檔案也沒問題-->
<resultMap id="selectDetailByIdResultMap" type="com.task.pojo.User" extends="baseResultMap">
<collection property="products" ofType="com.task.pojo.Product"
select="com.task.dao.ProductDao.selectByUserId"
column="id"
></collection>
</resultMap>
于是,我就在StaticPageLoader類中寫了一個方法,直接呼叫ProductDao和UserDao,然后運行除錯看看
public class StaticPageLoader implements ApplicationContextAware {
@Autowired
private InitService initService;
@Autowired
private ProductDao productDao;
@Autowired
private UserDao userDao;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
test();
init();
}
public void init() {
//這個會去呼叫對應UserDao
initService.init();
}
public void test() {
System.out.println("測驗,,,,,,,,,");
productDao.selectByUserId(5);
userDao.selectDetailById(5);
}
}
結果,運行沒有問題,
然后又測驗了幾次,發現只要在init方法之前注入UserDao就可以,
猜測原因
猜猜原因:執行實作ApplicationContextAware的類中的setApplicationContext方法時,并不是所有Bean都已經被加載到了容器中,如果要使用這些Bean,可以使用getBean等方法,
原因有待驗證,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/151704.html
標籤:Java
上一篇:for回圈遍歷的盜版筆記
