当前使用版本(必填,否则不予处理)

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

提 issue 的时候替换成了 3.5.3.1 发现也有同样的问题。

该问题是如何引起的?(确定最新版也有问题再提!!!)

先贴一下定义的几个类

// 数据库模型类
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
@TableName(value = "cabinet_factory_mode_images", autoResultMap = true)
public class CabinetFactoryModelImages {

    @TableId(value = "id", type= IdType.AUTO)
    private Long id;

    @TableField("imei")
    private String imei;

    @TableField("client_sn")
    private String clientSn;

    @TableField(value = "take_snapshot_event", typeHandler = FactoryModeImageTypeHandler.class)
    private List<TakeSnapshotEventValue> takeSnapshotEvent;

    @TableField("created_at")
    private LocalDateTime createAt;

    @TableField(value = "updated_at", fill = FieldFill.UPDATE, update = "now()")
    private LocalDateTime updateAt;
}


// 自定义的typehandler
public class FactoryModeImageTypeHandler extends AbstractJsonTypeHandler<List<TakeSnapshotEventValue>> {
    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected List<TakeSnapshotEventValue> parse(String json) {
        try {
            return objectMapper.readValue(json, new TypeReference<List<TakeSnapshotEventValue>>() {});
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    protected String toJson(List<TakeSnapshotEventValue> obj) {
        try {
            return objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

// typehandler里用到的vo
@Data
@EqualsAndHashCode(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TakeSnapshotEventValue extends AbsEventValue {

    @JsonProperty("trigger")
    private Integer trigger;

    @JsonProperty("angle")
    private Double angle; 

    @JsonProperty("media_type")
    private Integer mediaType; 

    @JsonProperty("camera")
    private Integer camera; 

    @JsonProperty("camera_v2")
    private Integer cameraV2; 

    @JsonProperty("url")
    private String url;

    @JsonProperty("upload_status")
    private Integer uploadStatus;

    @JsonProperty("client_sn")
    private String clientSn; 

    public Integer CameraNumber() {
        if (cameraV2 != null) {
            return cameraV2;
        }
        return camera;
    }
}


public abstract class AbsEventValue {
    @JsonProperty("asset_id")
    private String assetId; 

    @JsonProperty("event_time")
    private Long eventTime; 

    public Long getEventTime() {
        return eventTime;
    }

    public void setEventTime(Long eventTime) {
        this.eventTime = eventTime;
    }

    public String getAssetId() {
        return assetId;
    }

    public void setAssetId(String assetId) {
        this.assetId = assetId;
    }

}

对应的mysql表结构(mysql 5.7)

create table cabinet_factory_mode_images
(
    id                  bigint unsigned auto_increment
        primary key,
    imei                varchar(64)                         null,
    client_sn           varchar(64)                         null,
    take_snapshot_event text                                null,
    created_at          timestamp default CURRENT_TIMESTAMP not null,
    updated_at          timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP,
    constraint idx_client_sn
        unique (client_sn)
);

重现步骤(如果有就写完整)

在使用 Mapper 提供的 selectOne 方法时报错 java.lang.IllegalArgumentException: argument type mismatch. 打断点发现似乎没有走到 typehandler 的 parse 方法。 另数据写入的时候是正常的。

报错信息

堆栈信息:

java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.keynection.iotdatahandler.entity.pojo.mysql.CabinetFactoryModelImages with invalid types (Long,String,String,List,LocalDateTime,LocalDateTime) or values (922,869516056729309,20230615121419869516056729309pfigte000002,[{"asset_id":"YQAS56729309J515-2TTB","event_time":1686802472635,"trigger":0,"angle":0.0,"media_type":0,"camera_v2":61004,"url":"","upload_status":5,"client_sn":"20230615121419869516056729309pfigte000002"}],2023-06-15T14:01:14,2023-06-15T14:01:14). Cause: java.lang.IllegalArgumentException: argument type mismatch
    at com.keynection.iotdatahandler.application.iotMessageConsumer.MessageConsumer.onMessage(MessageConsumer.java:107)
    at com.keynection.iotdatahandler.application.iotMessageConsumer.MessageConsumer.onMessage(MessageConsumer.java:32)
    at org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer.handleMessage(DefaultRocketMQListenerContainer.java:449)
    at org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer.access$100(DefaultRocketMQListenerContainer.java:71)
    at org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer$DefaultMessageListenerConcurrently.consumeMessage(DefaultRocketMQListenerContainer.java:409)
    at org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService$ConsumeRequest.run(ConsumeMessageConcurrentlyService.java:402)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
    at java.util.concurrent.FutureTask.run(FutureTask.java)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:750)
Caused by: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.keynection.iotdatahandler.entity.pojo.mysql.CabinetFactoryModelImages with invalid types (Long,String,String,List,LocalDateTime,LocalDateTime) or values (922,869516056729309,20230615121419869516056729309pfigte000002,[{"asset_id":"YQAS56729309J515-2TTB","event_time":1686802472635,"trigger":0,"angle":0.0,"media_type":0,"camera_v2":61004,"url":"","upload_status":5,"client_sn":"20230615121419869516056729309pfigte000002"}],2023-06-15T14:01:14,2023-06-15T14:01:14). Cause: java.lang.IllegalArgumentException: argument type mismatch
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
    at com.sun.proxy.$Proxy67.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)
    at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:166)
    at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
    at com.sun.proxy.$Proxy107.selectList(Unknown Source)
    at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:172)
    at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:162)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
    at com.sun.proxy.$Proxy107.selectOne(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy108.selectOne(Unknown Source)
    at com.keynection.iotdatahandler.handler.nestedEventItemHandlerImpl.TakeSnapshotFactoryEventHandler.handleEvent(TakeSnapshotFactoryEventHandler.java:34)
    at com.keynection.iotdatahandler.handler.nestedEventItemHandlerImpl.TakeSnapshotFactoryEventHandler.handleEvent(TakeSnapshotFactoryEventHandler.java:22)
    at com.keynection.iotdatahandler.handler.messageHandlerImpl.EventMessageHandler.handle(EventMessageHandler.java:80)
    at com.keynection.iotdatahandler.handler.messageHandlerImpl.EventMessageHandler.handle(EventMessageHandler.java:24)
    at com.keynection.iotdatahandler.application.iotMessageConsumer.MessageConsumer.onMessage(MessageConsumer.java:104)
    ... 11 common frames omitted
Caused by: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.keynection.iotdatahandler.entity.pojo.mysql.CabinetFactoryModelImages with invalid types (Long,String,String,List,LocalDateTime,LocalDateTime) or values (922,869516056729309,20230615121419869516056729309pfigte000002,[{"asset_id":"YQAS56729309J515-2TTB","event_time":1686802472635,"trigger":0,"angle":0.0,"media_type":0,"camera_v2":61004,"url":"","upload_status":5,"client_sn":"20230615121419869516056729309pfigte000002"}],2023-06-15T14:01:14,2023-06-15T14:01:14). Cause: java.lang.IllegalArgumentException: argument type mismatch
    at org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:88)
    at org.apache.ibatis.reflection.factory.DefaultObjectFactory.create(DefaultObjectFactory.java:53)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyConstructorAutomapping(DefaultResultSetHandler.java:751)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createByConstructorSignature(DefaultResultSetHandler.java:703)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:669)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:642)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:404)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:361)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:335)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:308)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:201)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427)
    ... 39 common frames omitted
Caused by: java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:78)
    ... 64 common frames omitted

Comment From: chaoshui66

破案了, CabinetFactoryModelImages 类中没有加入 Constructor 注解,导致构造失败。

Comment From: wwlwwww

麻了,同踩了这坑,希望官方文档把这个标上。。

Comment From: jiefann

同样的问题,同时用了@Data和@Builder,导致没有无参构造方法,加上@NoArgsConstructor就好了