gpt4 book ai didi

java.lang.IllegalArgumentException : Result Maps collection does not contain value for a certain mapper 异常

转载 作者:行者123 更新时间:2023-12-05 06:04:14 46 4
gpt4 key购买 nike

我正在使用 MyBatis 开发一个应用程序,我遇到了一个非常奇怪的问题。
这已经在几天前发生了,但是通过取消对 dao-context2.xml 上的以下属性的注释,我能够解决

    <!-- <property name="mapperLocations" value="classpath*:src/main/resources/**/*.xml" /> -->

然而,它又回来了,我无法通过它,即使该行是否被评论。

基本信息

该表的 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 设置任何类型的日志记录。

我尝试过的事情

一些谷歌搜索建议我进行以下故障排除,但没有用:

  1. T_APPLICATION_STATUS 上的 SQL 语法(虽然一切看起来都很好)
  2. 指向加载所有内容的 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 是带有小 x 的 DatiAperturaContoEx

关于java.lang.IllegalArgumentException : Result Maps collection does not contain value for a certain mapper 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66429954/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com