Activiti踩坑记录(一),mybatis报错No typehandler found for property XXX问题

本文介绍在SpringBoot项目中引入Activiti7遇到的问题及解决方法,特别是如何处理与MyBatis-Plus版本冲突导致的mapper扫描错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

之前自己写的系统订单流程功能不够用,于是打算用用Activiti7,结果引入后就报错


问题描述:

环境:springboot@2.3.1 + shiro@1.7 + mybatis-plus@3.3.2

本次新增引入activiti-spring-boot-starter@7.1.0.M4 + activiti-bpmn-layout

(听说M6版本有强引入Spring Security,M5有其他BUG,这里为了避免麻烦就用的M4,但估计后续还有更多坑要填)

pom.xml新增如下:

		<properties>
	        <activiti.version>7.1.0.M4</activiti.version>
	    </properties>
	    
	    .....
	    
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!--自动化生成流程 -->
        <!-- https://mvnrepository.com/artifact/org.activiti/activiti-bpmn-layout -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>${activiti.version}</version>
        </dependency>

结果还没加Activiti相关的运行代码,DEBUG一次就开始报错了,mybatis扫描Mapper出错:No typehandler found for property logTime
在这里插入图片描述


原因分析:

一开始先排查了一下相关类的映射类型/字段/包名引入,没发现问题但是依旧报错,报错相关的属性logTime是LocalDateTime类型,但TIMESTAMP是可以正常映射的,其他类也同样是使用LocalDateTime没遇到过问题
在这里插入图片描述
后面听交流群的老哥说把LocalDateTime改成Date试一下,发现报错信息变了:
在这里插入图片描述
这里看报错信息内有mybatis的不同版本存在,推测是和mybatis-plus的引入冲突,后面注释掉之前引入的Activiti-spring-boot-starter可以正常运行,原本代码是没有问题,那只能是这个原因了


解决方案:

既然是Mybatis的重复引入冲突,那就去掉一个就好了,因为Mybatis-Plus有旧代码的依赖在,为保证稳定性,就排除掉新引入的Activiti-spring-boot-starter中的Mybatis。将pom.xml相关的代码改成以下就完成了


		<properties>
	        <activiti.version>7.1.0.M4</activiti.version>
	    </properties>
	    
	    .....
	    
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>${activiti.version}</version>
<!--            mybatis-plus引用冲突,需要排除-->
            <exclusions>
                <exclusion>
                    <artifactId>mybatis</artifactId>
                    <groupId>org.mybatis</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--自动化生成流程 -->
        <!-- https://mvnrepository.com/artifact/org.activiti/activiti-bpmn-layout -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        
<think>好的,我现在需要解决用户遇到的MyBatis问题:“No typehandler found for property responseData”。首先,我得理解这个错误的含义。根据经验,这个错误通常发生在MyBatis无法找到合适的类型处理器(TypeHandler)来处理某个属性的类型。用户提到的responseData属性可能是个复杂类型,比如自定义对象或者集合,而MyBatis默认的类型处理器无法处理它。 接下来,我应该考虑可能的原因。首先,检查responseData的Java类型。如果它是个自定义类,比如ResponseData,那么MyBatis可能不知道如何将其映射到数据库中的字段。这时候需要自定义TypeHandler。另外,检查MyBatis的映射文件(XML)或注解配置,确认是否指定了正确的类型处理器。 用户可能没有为responseData属性配置TypeHandler,或者在resultMap中没有正确声明。比如,在resultMap中,如果某个属性的类型是自定义的,需要使用typeHandler属性指定对应的处理器类。例如: <result property="responseData" column="response_data" typeHandler="com.example.CustomTypeHandler"/> 另外,需要确认自定义的TypeHandler是否已经被正确注册到MyBatis配置中。可以通过在mybatis-config.xml中添加<typeHandlers>配置,或者在Spring Boot的配置类中使用@MappedTypes和@MappedJdbcTypes注解来注册。 还有可能是数据库字段类型和Java类型不匹配。比如,responseData在数据库中可能是JSON或BLOB类型,而Java中是个对象,这时候需要JSON转换的TypeHandler,比如使用Jackson或者Fastjson来处理。 此外,查看用户提供的引用内容,虽然大部分是关于Spring MVC和Activiti的,但引用[4]提到配置问题,可能需要检查applicaton.yml或相关配置文件是否正确,确保TypeHandler的包路径被正确扫描。 可能的解决方案步骤: 1. 确认responseData的Java类型,如果是自定义类型,创建对应的TypeHandler。 2. 在MyBatis的配置文件中注册该TypeHandler,或者在Spring Boot中通过注解注册。 3. 在映射文件(XML)的resultMap中明确指定typeHandler属性。 4. 确保数据库字段类型与TypeHandler处理的类型匹配,如JSON字段使用JSON TypeHandler。 用户可能需要检查这些步骤中的哪步被遗漏或配置错误。比如,未注册TypeHandler,或者在resultMap中没有正确引用。另外,如果使用MyBatis Plus,可能需要使用@TableField注解指定typeHandler。 最后,建议用户提供更多代码细节,比如ResponseData类的定义、对应的Mapper配置,以便更准确地定位问题。</think>### MyBatis出现“No typehandler found for property responseData”的解决方案 #### 1. 核心问题定位 该错误表示MyBatis无法为实体类的`responseData`属性找到匹配的类型处理器。常见原因包括: - **未注册自定义TypeHandler**:当属性为自定义对象、枚举或复杂类型(如JSON)时 - **未在映射文件中显式声明TypeHandler**:即使注册了处理器,若未在`<resultMap>`中标注也会报错 - **数据库字段类型与Java类型冲突**:例如数据库存JSON字符串,但Java端未配置转换器 #### 2. 具体解决步骤 ##### 方法:自定义TypeHandler(推荐) **步骤1:创建处理器类** 假设`responseData`是存储JSON的字符串字段,对应Java对象为`ResponseData`类: ```java @MappedJdbcTypes(JdbcType.VARCHAR) // 声明处理的JDBC类型 @MappedTypes(ResponseData.class) // 声明处理的Java类型 public class ResponseDataTypeHandler extends BaseTypeHandler<ResponseData> { private static final ObjectMapper mapper = new ObjectMapper(); @Override public void setNonNullParameter(PreparedStatement ps, int i, ResponseData parameter, JdbcType jdbcType) { ps.setString(i, mapper.writeValueAsString(parameter)); } @Override public ResponseData getNullableResult(ResultSet rs, String columnName) { return mapper.readValue(rs.getString(columnName), ResponseData.class); } // 其他重写方法... } ``` **步骤2:注册TypeHandler** **MyBatis独立配置**(`mybatis-config.xml`): ```xml <typeHandlers> <typeHandler handler="com.example.ResponseDataTypeHandler"/> </typeHandlers> ``` **Spring Boot配置**(`application.yml`): ```yaml mybatis: type-handlers-package: com.example.handlers # TypeHandler所在包路径[^4] ``` ##### 方法二:在映射文件中直接指定 修改Mapper XML中的`<resultMap>`: ```xml <resultMap id="resultMap" type="YourEntity"> <result property="responseData" column="response_data" typeHandler="com.example.ResponseDataTypeHandler"/> </resultMap> ``` #### 3. 验证配置有效性 - 检查TypeHandler是否被扫描到(查看启动日志) - 调试TypeHandler的`setParameter()`和`getResult()`方法 - 使用MyBatis的SQL日志确认类型转换过程 #### 4. 高级场景处理 **场景1:存储JSON到VARCHAR字段** 可直接使用MyBatis官方支持的JSON处理器(需添加依赖): ```xml <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-typehandlers-json</artifactId> </dependency> ``` **场景2:枚举类型处理** 使用MyBatis内置的`EnumTypeHandler`或自定义枚举转换器: ```java @EnumValue // 标记枚举中对应存储值的字段 public enum Status { ACTIVE(1), INACTIVE(0); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值