当前使用版本(必填,否则不予处理)
<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就好了