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

3.0.3

该问题是怎么引起的?(请使用最新版(具体版本查看CHANGELOG.md),如还有该问题再提 issue!)

使用通用枚举

数据采用同service的save方法保存, 且保存后结果正常

重现步骤

  1. 实体
public class UserAuth implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "auth_id", type = IdType.AUTO)
    private Integer authId;

    /**
     * 用户ID
     */
    private Integer userId;

    /**
     * 认证类型
     */
    private UserAuthType type;

    /**
     * 身份标识
     */
    private String identify;

    /**
     * token
     */
    private String token;

    /**
     * 创建时间
     */
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    private LocalDateTime updatedTime;
}
  1. 枚举类
public enum UserAuthType implements IEnum<String> {

    PASSWORD("password"), GITHUB("github");

    private String value;

    UserAuthType(String value) {
        this.value = value;
    }

    @Override
    public String getValue() {
        return this.value;
    }
}
  1. 配置文件
mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml
  typeAliasesPackage: cn.xxx.blog.model.entity
  typeEnumsPackage: cn.xxx.blog.model.entity.constant
  1. 调用方法
QueryWrapper<UserAuth> authQueryWrapper = new QueryWrapper<UserAuth>()
                .eq("user_id", user.getUserId())
                .eq("type", UserAuthType.PASSWORD);
        UserAuth userAuth = userAuthService.getOne(authQueryWrapper);

报错信息

Caused by: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'type' from result set.  Cause: java.lang.IllegalArgumentException: No enum constant cn.xxx.blog.model.entity.constant.UserAuthType.password
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
    at com.sun.proxy.$Proxy93.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
    at com.baomidou.mybatisplus.core.override.PageMapperMethod.executeForMany(PageMapperMethod.java:173)
    at com.baomidou.mybatisplus.core.override.PageMapperMethod.execute(PageMapperMethod.java:86)
    at com.baomidou.mybatisplus.core.override.PageMapperProxy.invoke(PageMapperProxy.java:64)
    at com.sun.proxy.$Proxy96.selectList(Unknown Source)
    at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.getOne(ServiceImpl.java:287)
    at com.baomidou.mybatisplus.extension.service.IService.getOne(IService.java:205)
    at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684)
    at cn.xxx.blog.service.impl.UserAuthServiceImpl$$EnhancerBySpringCGLIB$$c1d559b6.getOne(<generated>)
    at cn.xxx.blog.common.security.CustomUserDetailsService.loadUserByUsername(CustomUserDetailsService.java:44)
    at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:104)
    ... 54 more
Caused by: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'type' from result set.  Cause: java.lang.IllegalArgumentException: No enum constant cn.xxx.blog.model.entity.constant.UserAuthType.password
    at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:68)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyAutomaticMappings(DefaultResultSetHandler.java:520)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:401)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:355)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:330)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:303)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:196)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
    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.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
    at com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor.intercept(PerformanceInterceptor.java:174)
    at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
    at com.sun.proxy.$Proxy123.query(Unknown Source)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)
    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:83)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    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:433)
    ... 68 more
Caused by: java.lang.IllegalArgumentException: No enum constant cn.xxx.blog.model.entity.constant.UserAuthType.password
    at java.lang.Enum.valueOf(Enum.java:238)
    at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:49)
    at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:26)
    at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:66)

Comment From: banto6

切换到3.0-RC3可以正常使用

Comment From: miemieYaho

你把 string 换成 integer 试试,数据库也改成 integer

Comment From: qmdx

typeEnumsPackage: cn.xxx.blog.model.entity.constant 枚举类是在这里?

Comment From: banto6

@miemieYaho 尝试改成integer也不行 @qmdx 是的,版本降到3.0-RC3是可以正常工作的

Comment From: miemieYaho

方便的话在 github 上传一个能复现bug的项目,我这里一直正常使用没遇到你说的问题

Comment From: banto6

@miemieYaho git项目地址: https://github.com/buyi998/bug.git

Comment From: miemieYaho

你的项目有几个问题: 1. 去除 spring-boot-devtools ,该插件会导致很多问题,估计应该是主要原因 2. 去除 mybatis-spring-boot-starter ,mp 不需要这个 你先进行一些尝试

Comment From: banto6

@miemieYaho 非常感谢, 问题就是出在spring-boot-devtools身上, 移除后恢复正常。

Comment From: sunny0130

我遇到了同样的问题,项目里确实也有spring-boot-devtools,但遗憾的是我注释了该依赖后重新编译、启动后还是报错。

Comment From: manonglushang

我报错的原因是因为 步骤2: 配置扫描通用枚举 从 3.5.2 开始无需配置 ,重新配上就好了