java.lang.IllegalArgumentException: 结果映射集合不包含某个映射器的值
java.lang.IllegalArgumentException: Result Maps collection does not contain value for a certain mapper
我正在使用 MyBatis 开发一个应用程序,我遇到了一个非常奇怪的问题。
这已经在几天前发生了,但是通过在 dao-context2.xml 上取消注释以下 属性 我能够解决
<!-- <property name="mapperLocations" value="classpath*:src/main/resources/**/*.xml" /> -->
然而,它又回来了,我无法通过它,即使该行是否被评论。
基本信息
table 的 DDL 如下(Oracle 风格)
CREATE TABLE "T_APPLICATION_STATUS"
( "STATUS" VARCHAR2(100) NOT NULL ENABLE,
"DATA_UPDATE" TIMESTAMP (6)
) ;
映射到以下 Java Bean
public class ApplicationStatus {
private String lockStatus;
private Date dataUpdate;
public String getLockStatus() {
return lockStatus;
}
public void setLockStatus(String lockStatus) {
this.lockStatus = lockStatus;
}
public Date getDataUpdate() {
return dataUpdate;
}
public void setDataUpdate(Date dataUpdate) {
this.dataUpdate = dataUpdate;
}
}
一切都映射在ApplicationStatusMapper.xml里面,定义如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="some.package.db.mappers.ApplicationStatusMapper">
<resultMap type="some.package.db.model.ApplicationStatus" id="ApplicationStatus">
<result property="lockStatus" column="STATUS"/>
<result property="dataUpdate" column="DATA_UPDATE"/>
</resultMap>
<select id="getApplicationStatus" resultMap="ApplicationStatus">
SELECT *
FROM T_APPLICATION_STATUS
</select>
</mapper>
对应下面的Mapper Interface(Java flavor)
public interface ApplicationStatusMapper {
@Update("UPDATE T_APPLICATION_STATUS "
+ "SET "
+ " STATUS = #{lockStatus}, "
+ " DATA_UPDATE = SYSDATE ")
public void updateStatus(ApplicationStatus applicationStatus);
@Select("SELECT STATUS AS lockStatus, DATA_UPDATE as dataUpdate FROM T_APPLICATION_STATUS")
public ApplicationStatus getApplicationStatus();
}
所有这些都映射到 dao-context2.xml
中的这个片段
<?xml version="1.0" encoding="UTF-8"?>
<!-- Configures the Dao Context -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="stringTrimmingTypeHandler" class="some.package.db.handler.StringTrimmingTypeHandler"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeHandlers" ref="stringTrimmingTypeHandler" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- tolto il commento a mapperLocations perchè la query getMaxId() - SELECT_LAST_ID in TrasferimentoFondiMapper.java non funzionava -->
<!-- <property name="mapperLocations" value="classpath*:src/main/resources/**/*.xml" /> -->
</bean>
<bean id="applicationStatusMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="some.package.db.mappers.ApplicationStatusMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<bean id="datiAperturaContoMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="some.package.db.mappers.DatiAperturaContoMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</beans>
这是mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="jdbcTypeForNull" value="NULL" />
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>
Pom 依赖项
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
问题
当用户导航到应用程序时,它启动的第一个查询会爆炸。具体来说,第一个查询是检查应用程序是否处于维护状态。
Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for some.package.db.mappers.DatiAperturaContoMapper.DatiAperturaContoEX
在我的项目中,我确实有一些与 DatiAperturaContoMapper 和 DatiAperturaContoEX 相关的东西,但它们与 T_APPLICATION_STATUS 映射器没有任何关系。
结果是以下错误,在调用 ApplicationStatusMapper.java 时触发。遗憾的是,我也无法为 MyBatis 设置任何类型的日志记录。
我尝试过的东西
一些谷歌搜索建议我进行以下故障排除,但没有用:
- SQL T_APPLICATION_STATUS 语法(虽然一切看起来都很好)
- 指向加载所有内容的 mapperLocations(这似乎有效,但现在在部署时需要永远加载并导致 OOM 错误)
我正在寻找任何可以为我指明正确方向的建议。有人知道我可以从哪里开始吗?
好的,看来是我这边的失误。
至少根据我的理解,MyBatis 似乎不是在加载应用程序时加载 *Mapper.xml 文件,而是在执行第一个查询时加载。
在这种情况下,这个异常
Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for some.package.db.mappers.DatiAperturaContoMapper.DatiAperturaContoEX
告诉我 DatiAperturaContoMapper 的映射器存在一些错误。
具体来说,这导致以下
<resultMap id="DatiAperturaContoEx" type="some.package.db.model.DatiAperturaContoEx">
my mapping...
</resultMap>
<select id="getDatiAperturaContoForAdempimenti" resultMap="DatiAperturaContoEX">
my fancy query
</select>
错误出在 SELECT 中的引用中,最后的 X 是大写字母,而 ID 是 DatiAperturaContoEx 带有一个小 x
我正在使用 MyBatis 开发一个应用程序,我遇到了一个非常奇怪的问题。
这已经在几天前发生了,但是通过在 dao-context2.xml 上取消注释以下 属性 我能够解决
<!-- <property name="mapperLocations" value="classpath*:src/main/resources/**/*.xml" /> -->
然而,它又回来了,我无法通过它,即使该行是否被评论。
基本信息
table 的 DDL 如下(Oracle 风格)
CREATE TABLE "T_APPLICATION_STATUS"
( "STATUS" VARCHAR2(100) NOT NULL ENABLE,
"DATA_UPDATE" TIMESTAMP (6)
) ;
映射到以下 Java Bean
public class ApplicationStatus {
private String lockStatus;
private Date dataUpdate;
public String getLockStatus() {
return lockStatus;
}
public void setLockStatus(String lockStatus) {
this.lockStatus = lockStatus;
}
public Date getDataUpdate() {
return dataUpdate;
}
public void setDataUpdate(Date dataUpdate) {
this.dataUpdate = dataUpdate;
}
}
一切都映射在ApplicationStatusMapper.xml里面,定义如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="some.package.db.mappers.ApplicationStatusMapper">
<resultMap type="some.package.db.model.ApplicationStatus" id="ApplicationStatus">
<result property="lockStatus" column="STATUS"/>
<result property="dataUpdate" column="DATA_UPDATE"/>
</resultMap>
<select id="getApplicationStatus" resultMap="ApplicationStatus">
SELECT *
FROM T_APPLICATION_STATUS
</select>
</mapper>
对应下面的Mapper Interface(Java flavor)
public interface ApplicationStatusMapper {
@Update("UPDATE T_APPLICATION_STATUS "
+ "SET "
+ " STATUS = #{lockStatus}, "
+ " DATA_UPDATE = SYSDATE ")
public void updateStatus(ApplicationStatus applicationStatus);
@Select("SELECT STATUS AS lockStatus, DATA_UPDATE as dataUpdate FROM T_APPLICATION_STATUS")
public ApplicationStatus getApplicationStatus();
}
所有这些都映射到 dao-context2.xml
中的这个片段<?xml version="1.0" encoding="UTF-8"?>
<!-- Configures the Dao Context -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="stringTrimmingTypeHandler" class="some.package.db.handler.StringTrimmingTypeHandler"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeHandlers" ref="stringTrimmingTypeHandler" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- tolto il commento a mapperLocations perchè la query getMaxId() - SELECT_LAST_ID in TrasferimentoFondiMapper.java non funzionava -->
<!-- <property name="mapperLocations" value="classpath*:src/main/resources/**/*.xml" /> -->
</bean>
<bean id="applicationStatusMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="some.package.db.mappers.ApplicationStatusMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<bean id="datiAperturaContoMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="some.package.db.mappers.DatiAperturaContoMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</beans>
这是mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="jdbcTypeForNull" value="NULL" />
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>
Pom 依赖项
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
问题
当用户导航到应用程序时,它启动的第一个查询会爆炸。具体来说,第一个查询是检查应用程序是否处于维护状态。
Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for some.package.db.mappers.DatiAperturaContoMapper.DatiAperturaContoEX
在我的项目中,我确实有一些与 DatiAperturaContoMapper 和 DatiAperturaContoEX 相关的东西,但它们与 T_APPLICATION_STATUS 映射器没有任何关系。
结果是以下错误,在调用 ApplicationStatusMapper.java 时触发。遗憾的是,我也无法为 MyBatis 设置任何类型的日志记录。
我尝试过的东西
一些谷歌搜索建议我进行以下故障排除,但没有用:
- SQL T_APPLICATION_STATUS 语法(虽然一切看起来都很好)
- 指向加载所有内容的 mapperLocations(这似乎有效,但现在在部署时需要永远加载并导致 OOM 错误)
我正在寻找任何可以为我指明正确方向的建议。有人知道我可以从哪里开始吗?
好的,看来是我这边的失误。
至少根据我的理解,MyBatis 似乎不是在加载应用程序时加载 *Mapper.xml 文件,而是在执行第一个查询时加载。
在这种情况下,这个异常
Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for some.package.db.mappers.DatiAperturaContoMapper.DatiAperturaContoEX
告诉我 DatiAperturaContoMapper 的映射器存在一些错误。
具体来说,这导致以下
<resultMap id="DatiAperturaContoEx" type="some.package.db.model.DatiAperturaContoEx">
my mapping...
</resultMap>
<select id="getDatiAperturaContoForAdempimenti" resultMap="DatiAperturaContoEX">
my fancy query
</select>
错误出在 SELECT 中的引用中,最后的 X 是大写字母,而 ID 是 DatiAperturaContoEx 带有一个小 x