baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.3k stars 4.3k forks source link

3.3.0版本使用@TableName(autoResultMap = true)时更新数据库枚举报错 #2141

Closed xiaobaicainiaoname closed 4 years ago

xiaobaicainiaoname commented 4 years ago

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

mybatis-plus-boot-starter 3.3.0

该问题是怎么引起的?*([最新版](https://search.maven.org/search?q=g:com.baomidou%20a:mybatis-)上已修复的会直接close掉)**

添加注解@TableName(autoResultMap = true)后枚举更新报错

重现步骤

当实体类加上注解@TableName(autoResultMap = true),数据字段加上@TableField(typeHandler = MybatisEnumTypeHandler.class)使用枚举,枚举中加上了@EnumValue说明入库信息;在使用查询功能时可以正常查询,但是执行更新方法.updateById(xxxxx)时报错。

报错信息

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Failed invoking constructor for handler class com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440) at com.sun.proxy.$Proxy109.update(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:287) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:65) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:96) at com.sun.proxy.$Proxy116.updateById(Unknown Source) at com.travelCat.controller.thirdService.WeixinInviteController.redirect(WeixinInviteController.java:155) 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.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.github.xiaoymin.swaggerbootstrapui.filter.SecurityBasicAuthFilter.doFilter(SecurityBasicAuthFilter.java:84) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.github.xiaoymin.swaggerbootstrapui.filter.ProductionSecurityFilter.doFilter(ProductionSecurityFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.ibatis.type.TypeException: Failed invoking constructor for handler class com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler at org.apache.ibatis.type.TypeHandlerRegistry.getInstance(TypeHandlerRegistry.java:432) at org.apache.ibatis.builder.BaseBuilder.resolveTypeHandler(BaseBuilder.java:143) at org.apache.ibatis.builder.BaseBuilder.resolveTypeHandler(BaseBuilder.java:132) at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.buildParameterMapping(SqlSourceBuilder.java:121) at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.handleToken(SqlSourceBuilder.java:67) at org.apache.ibatis.parsing.GenericTokenParser.parse(GenericTokenParser.java:77) at org.apache.ibatis.builder.SqlSourceBuilder.parse(SqlSourceBuilder.java:45) at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:42) at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:297) at org.apache.ibatis.executor.statement.BaseStatementHandler.(BaseStatementHandler.java:64) at org.apache.ibatis.executor.statement.PreparedStatementHandler.(PreparedStatementHandler.java:41) at org.apache.ibatis.executor.statement.RoutingStatementHandler.(RoutingStatementHandler.java:46) at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:592) at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doUpdate(MybatisSimpleExecutor.java:52) at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.update(MybatisCachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) 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:426) ... 62 common frames omitted Caused by: java.lang.reflect.InvocationTargetException: null 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.type.TypeHandlerRegistry.getInstance(TypeHandlerRegistry.java:428) ... 83 common frames omitted Caused by: java.lang.IllegalArgumentException: Could not find @EnumValue in Class: java.lang.Object. at com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler.lambda$null$0(MybatisEnumTypeHandler.java:65) at java.util.Optional.orElseThrow(Optional.java:290) at com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler.lambda$new$1(MybatisEnumTypeHandler.java:65) at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1688) at com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler.(MybatisEnumTypeHandler.java:64) ... 88 common frames omitted

miemieYaho commented 4 years ago

枚举字段不需要加注解指定typehandler

bert82503 commented 3 months ago

我们也遇到这个问题,save保存时是正常的,updateById更新时就报这个错。枚举值看着也是正常的,为何类型变成了java.lang.Object? 帮忙看看 @miemieYaho

MyBatis Plus版本

    <properties>
        <mybatis-plus.version>3.5.3.2</mybatis-plus.version>
    </properties>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-bom</artifactId>
                <version>${mybatis-plus.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

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

最底下的根因Caused by:

Caused by: java.lang.IllegalArgumentException: Could not find @EnumValue in Class: java.lang.Object.
        at com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler.lambda$new$0(MybatisEnumTypeHandler.java:65)
        at java.util.Optional.orElseThrow(Optional.java:290)
        at com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler.<init>(MybatisEnumTypeHandler.java:65)
        ... 105 more

没有定义XML

import java.time.LocalDateTime;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler;
import com.lefit.gateway.admin.client.model.EnableStateEnum;
import com.lefit.gateway.admin.client.model.EnvironmentTagEnum;
import lombok.Data;

/**
 * 接口缓存配置【数据对象】
 *
 * @since 2024/5/17
 */
@Data
@TableName(value = "t_api_interface_cache_config")
public class InterfaceCacheConfigDo {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 接口缓存配置名称
     */
    @TableField(value = "cache_config_name")
    private String cacheConfigName;

    // ...

    /**
     * 环境标签,1-开发环境,2-测试环境,3-预发环境,4-生产环境
     */
    @TableField(value = "environment_tag", typeHandler = MybatisEnumTypeHandler.class)
    private EnvironmentTagEnum environmentTag;

    /**
     * 启用状态,0-未启用,1-启用
     */
    @TableField(value = "enable_status", typeHandler = MybatisEnumTypeHandler.class)
    private EnableStateEnum enableStatus;

    // ...

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
[arthas@7]$ watch com.baomidou.mybatisplus.extension.service.IService updateById '{params, returnObj, throwExp}' -x 2
Press Q or Ctrl+C to abort.
Affect(class count: 8 , method count: 3) cost in 1255 ms, listenerId: 1
method=com.baomidou.mybatisplus.extension.service.IService.updateById location=AtExceptionExit
ts=2024-05-30 10:33:52; [cost=3.900211ms] result=@ArrayList[
    @Object[][
        @InterfaceCacheConfigDo[InterfaceCacheConfigDo(id=6, cacheConfigName=用户端广告位, cacheConfigDescription=用户端获取广告位, apiCode=null, serviceName=com.leoao.guide.api.NewUserRightsApi, methodName=query, environmentTag=STAGING_ENV, enableStatus=ENABLE, ownerId=6184, editorId=6184, createTime=null, updateTime=null)],
    ],
    null,
    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Failed invoking constructor for handler class com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
        at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:97)
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
        at com.sun.proxy.$Proxy135.update(Unknown Source)
        at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:288)
        at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:64)
        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.$Proxy140.updateById(Unknown Source)
        at com.baomidou.mybatisplus.extension.service.IService.updateById(IService.java:236)
        at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
        at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)
        at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)
        at com.lefit.gateway.admin.persistence.service.impl.InterfaceCacheConfigServiceImpl$$EnhancerBySpringCGLIB$$6c9c332e.updateById(<generated>)
        at com.lefit.gateway.admin.repository.impl.InterfaceCacheConfigRepositoryImpl.saveInterfaceCacheConfig(InterfaceCacheConfigRepositoryImpl.java:101)
        at java.util.Optional.ifPresent(Optional.java:159)
        at com.lefit.gateway.admin.repository.impl.InterfaceCacheConfigRepositoryImpl.save(InterfaceCacheConfigRepositoryImpl.java:83)
        at com.lefit.gateway.admin.repository.impl.InterfaceCacheConfigRepositoryImpl$$FastClassBySpringCGLIB$$81c27d8b.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)
        at com.lefit.gateway.admin.repository.impl.InterfaceCacheConfigRepositoryImpl$$EnhancerBySpringCGLIB$$91daedbf.save(<generated>)
        at com.lefit.gateway.admin.api.impl.InterfaceCacheConfigApiImpl.save(InterfaceCacheConfigApiImpl.java:73)
        at com.lefit.gateway.admin.api.impl.InterfaceCacheConfigApiImplDubboWrap0.invokeMethod(InterfaceCacheConfigApiImplDubboWrap0.java)
        at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:89)
        at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:100)
        at org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:55)
        at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56)
        at org.apache.dubbo.rpc.filter.ClassLoaderCallbackFilter.invoke(ClassLoaderCallbackFilter.java:38)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:80)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:45)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.monitor.support.MonitorFilter.$sw$original$invoke$1vamrv0(MonitorFilter.java:108)
        at org.apache.dubbo.monitor.support.MonitorFilter.$sw$original$invoke$1vamrv0$accessor$$sw$p4vq621(MonitorFilter.java)
        at org.apache.dubbo.monitor.support.MonitorFilter$$sw$auxiliary$v8o9k93.call(Unknown Source)
        at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:86)
        at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:54)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.filter.AccessLogFilter.invoke(AccessLogFilter.java:120)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.metrics.observation.ObservationReceiverFilter.invoke(ObservationReceiverFilter.java:57)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:217)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:54)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.metrics.filter.MetricsFilter.invoke(MetricsFilter.java:86)
        at org.apache.dubbo.metrics.filter.MetricsProviderFilter.invoke(MetricsProviderFilter.java:37)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.filter.ProfilerServerFilter.invoke(ProfilerServerFilter.java:66)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:145)
        at com.leoao.lpaas.compatable.ContextFilterWrapper.invoke(ContextFilterWrapper.java:35)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349)
        at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CallbackRegistrationInvoker.invoke(FilterChainBuilder.java:197)
        at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:167)
        at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:110)
        at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:205)
        at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
        at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:64)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.dubbo.common.threadlocal.InternalRunnable.run(InternalRunnable.java:39)
        at java.lang.Thread.run(Thread.java:750)
Caused by: org.apache.ibatis.type.TypeException: Failed invoking constructor for handler class com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
        at org.apache.ibatis.type.TypeHandlerRegistry.getInstance(TypeHandlerRegistry.java:454)
        at org.apache.ibatis.builder.BaseBuilder.resolveTypeHandler(BaseBuilder.java:144)
        at org.apache.ibatis.builder.BaseBuilder.resolveTypeHandler(BaseBuilder.java:133)
        at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.buildParameterMapping(SqlSourceBuilder.java:144)
        at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.handleToken(SqlSourceBuilder.java:89)
        at org.apache.ibatis.parsing.GenericTokenParser.parse(GenericTokenParser.java:76)
        at org.apache.ibatis.builder.SqlSourceBuilder.parse(SqlSourceBuilder.java:51)
        at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:42)
        at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:320)
        at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:65)
        at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:42)
        at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:47)
        at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:714)
        at org.apache.ibatis.executor.ReuseExecutor.doUpdate(ReuseExecutor.java:50)
        at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
        at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
        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:425)
        ... 79 more
Caused by: java.lang.reflect.InvocationTargetException
        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.type.TypeHandlerRegistry.getInstance(TypeHandlerRegistry.java:450)
        ... 100 more
Caused by: java.lang.IllegalArgumentException: Could not find @EnumValue in Class: java.lang.Object.
        at com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler.lambda$new$0(MybatisEnumTypeHandler.java:65)
        at java.util.Optional.orElseThrow(Optional.java:290)
        at com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler.<init>(MybatisEnumTypeHandler.java:65)
        ... 105 more
,
]
bert82503 commented 3 months ago

建议提供完整的解决方法,说明问题根因,避免重复踩坑。

自动映射枚举 https://baomidou.com/guides/auto-convert-enum/

1755

2024

bert82503 commented 3 months ago

按照官方文档,确实解决了

自动映射枚举 https://baomidou.com/guides/auto-convert-enum/

声明通用枚举属性 方式一:使用 @EnumValue 注解枚举属性

配置 MyBatis-Plus 自动映射枚举 方式二:全局修改 DefaultEnumTypeHandler

image image

InterfaceCacheConfigDo

import java.time.LocalDateTime;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.lefit.gateway.admin.client.model.EnableStateEnum;
import com.lefit.gateway.admin.client.model.EnvironmentTagEnum;
import lombok.Data;

/**
 * 接口缓存配置【数据对象】
 *
 * @since 2024/5/17
 */
@Data
@TableName(value = "t_api_interface_cache_config", autoResultMap = true)
public class InterfaceCacheConfigDo {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    // ...

    /**
     * 环境标签,1-开发环境,2-测试环境,3-预发环境,4-生产环境
     */
    @TableField(value = "environment_tag")
    private EnvironmentTagEnum environmentTag;

    /**
     * 启用状态,0-未启用,1-启用
     */
    @TableField(value = "enable_status")
    private EnableStateEnum enableStatus;

    // ...

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

EnvironmentTagEnum

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 环境标签
 *
 * @since 2024/5/17
 */
@Getter
@AllArgsConstructor
public enum EnvironmentTagEnum {
    /**
     * 开发环境
     */
    DEVELOP_ENV(0),
    /**
     * 测试环境
     */
    TEST_ENV(1),
    /**
     * 预发环境
     */
    STAGING_ENV(2),
    /**
     * 生产环境
     */
    PRODUCTION_ENV(3),
    ;

    /**
     * 标记数据库存的值是code
     */
    @EnumValue
    private final int code;
}

EnableStateEnum

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 启用状态
 *
 * @since 2024/5/17
 */
@Getter
@AllArgsConstructor
public enum EnableStateEnum {
    /**
     * 未启用
     */
    NOT_ENABLE(0),
    /**
     * 启用
     */
    ENABLE(1),
    ;

    /**
     * 标记数据库存的值是code
     */
    @EnumValue
    private final int code;
}

application.properties

mybatis-plus.configuration.default-enum-type-handler=com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler