将转换后的枚举值插入MySql Smallint列时发生JDBC java.sql.SQLException

将转换后的枚举值插入MySql Smallint列时发生JDBC java.sql.SQLException,mysql,spring,spring-jdbc,enumeration,Mysql,Spring,Spring Jdbc,Enumeration,我试图使用枚举来显示“权限”字段(读、写等)的可读值。当我将记录存储在关联的MySQL表中时,需要将permission enum字段转换为关联的整数(1、2、4等)。但是,当我运行SpringBoot应用程序并调用POST端点时,我遇到了一个奇怪的SQL异常。例外情况如下: 无法执行DbAction.InsertRoot(entity=Invite(id=null,createdAt=2020-09-19 18:12:01,createdBy=1,listId=8,token=c3b95dc9

我试图使用枚举来显示“权限”字段(读、写等)的可读值。当我将记录存储在关联的MySQL表中时,需要将permission enum字段转换为关联的整数(1、2、4等)。但是,当我运行SpringBoot应用程序并调用POST端点时,我遇到了一个奇怪的SQL异常。例外情况如下:

无法执行DbAction.InsertRoot(entity=Invite(id=null,createdAt=2020-09-19 18:12:01,createdBy=1,listId=8,token=c3b95dc9-ec4d-4dde-a461-b12746afa61e,expiresAt=2020-09-26 18:12:01,permission=2),generatedId=null)及其根本原因 java.sql.SQLException:第1行“permission”列的整数值“WRITE”不正确 在com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)~[mysql-connector-java-8.0.19.jar:8.0.19]

我觉得奇怪的是,db操作会报告要插入的“permission”字段是2,而SQL异常报告“WRITE”不是有效的整数值。知道我遗漏了什么吗

下面是值得注意的代码和配置。请注意,我使用的是JDBC而不是JPA:

以下是enum类:

public enum Permission {
    READ(1), WRITE(2), CREATE(4), DELETE(8), ADMIN(16);

    private Integer value;

    Permission(final Integer value) {
        this.value = value;
    }

    public Integer getValue() {
        return this.value;
    }

    //@JsonCreator
    @Override
    public String toString() {
        return this.getValue().toString();
    }

    //@JsonValue
    public static Permission forValue(final String name) {
        return Permission.valueOf(name);
    }
}
这里是POJO/实体:

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;

@Data
@AllArgsConstructor
@Builder
@ToString
public class Invite {

    public static final int TOKEN_MINIMUM_LENGTH = 36;
    public static final int TOKEN_MAXIMUM_LENGTH = 40;

    @Id
    private Long id;

    private String createdAt;

    private String createdBy;

    private Long listId;

    private String token;

    private String expiresAt;

    private Permission permission;

}
下面是JdbcCustomConversions。应该注意的是,在调试时,ReadingConverter似乎会跳闸,但WritingConverter不会。我不确定这是否是问题的一部分


import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import java.util.Arrays;

@Configuration
@EnableAutoConfiguration
public class JdbcConfiguration extends AbstractJdbcConfiguration {

    /**
     * JDBC Custom Conversions.
     *
     */
    @Override
    public JdbcCustomConversions jdbcCustomConversions() {
        return new JdbcCustomConversions(Arrays.asList(PermissionToInteger.INSTANCE, IntegerToPermission.INSTANCE));
    }

    // I have never seen this get tripped
    @WritingConverter
    enum PermissionToInteger implements Converter<Permission, Integer> {

        INSTANCE;

        @Override
        public Integer convert(final Permission permission) {
            return permission == null ? null : permission.getValue();
        }
    }

    // this one trips in the debugger and appears to be working fine
    @ReadingConverter
    enum IntegerToPermission implements Converter<Integer, Permission> {

        INSTANCE;

        @Override
        public Permission convert(final Integer code) {
            for (final Permission perm: Permission.values()) {
                if (perm.getValue().equals(code)) {
                    return perm;
                }
            }
            return null;
        }
    }
}

导入org.springframework.boot.autoconfigure.EnableAutoConfiguration;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.core.convert.converter.converter;
导入org.springframework.data.convert.ReadingConverter;
导入org.springframework.data.convert.WritingConverter;
导入org.springframework.data.jdbc.core.convert.jdbcustomconversions;
导入org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
导入org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
导入java.util.array;
@配置
@启用自动配置
公共类JdbcConfiguration扩展了AbstractJdbcConfiguration{
/**
*JDBC自定义转换。
*
*/
@凌驾
公共JdbcCustomConversions JdbcCustomConversions(){
返回新的JDBCCustomConversion(Arrays.asList(PermissionToInteger.INSTANCE,integerOperamission.INSTANCE));
}
//我从没见过这个被绊倒
@写转换器
enum PermissionToInteger实现转换器{
实例;
@凌驾
公共整数转换(最终权限){
返回权限==null?null:permission.getValue();
}
}
//这一个在调试器中跳闸,似乎工作正常
@读取转换器
枚举整数操作器实现转换器{
实例;
@凌驾
公共权限转换(最终整数代码){
for(最终权限perm:Permission.values()){
if(perm.getValue().equals(代码)){
回烫;
}
}
返回null;
}
}
}
以下是简单的存储库:

import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
import java.util.Optional;

public interface InviteRepository extends CrudRepository<Invite, Long> {

    @Query("SELECT * from invite where token = :token")
    Optional<Invite> findByToken(String token);

    @Query("SELECT * from invite where created_by = :userId")
    List<Invite> findByUserId(Long userId);

    @Query("SELECT * from invite where list_id = :wishlistId")
    List<Invite> findByWishlistId(Long wishlistId);

}
import org.springframework.data.jdbc.repository.query.query;
导入org.springframework.data.repository.crudepository;
导入java.util.List;
导入java.util.Optional;
公共接口存储库扩展了Crudepository{
@查询(“从邀请中选择*,其中标记=:标记”)
可选findByToken(字符串标记);
@查询(“从创建者处选择*:userId”)
列出findByUserId(长用户标识);
@查询(“从邀请列表中选择*。\u id=:wishlistId”)
列表findByWishlistId(Long-wishlistId);
}
任何提示都将不胜感激


Aaron

修复方法是将WritingConverter更改为字符串而不是整数:

@WritingConverter
public enum PermissionToInteger implements Converter<Permission, String> {

    INSTANCE;

    @Override
    public String convert(final Permission permission) {
        return permission == null ? null : permission.getValue().toString();
    }
}
@WritingConverter
公共枚举权限Integer实现转换器{
实例;
@凌驾
公共字符串转换(最终权限){
返回权限==null?null:permission.getValue().toString();
}
}

您需要使用
@Enumerated
注释。在这里你可以找到关于这篇文章:还有这篇: