Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理更改的枚举定义-数据库 介绍_Java_Spring_Oracle_Enums - Fatal编程技术网

Java 处理更改的枚举定义-数据库 介绍

Java 处理更改的枚举定义-数据库 介绍,java,spring,oracle,enums,Java,Spring,Oracle,Enums,首席架构师在spring boot项目中更改了枚举定义 发件人: 致: 处理这个问题的正确方法是什么?其他一些Javaspringboot应用程序现在正在崩溃。有没有办法告诉jackson反序列化程序在这些情况下执行某种转换 我目前的工作 我所做的是在oracle数据库上运行两条update语句: UPDATE store set PAYLOAD = REPLACE(PAYLOAD, '"processState":"P"','"processState":"PARTIAL"') where

首席架构师在spring boot项目中更改了枚举定义

发件人:

致:

处理这个问题的正确方法是什么?其他一些
Java
springboot
应用程序现在正在崩溃。有没有办法告诉jackson反序列化程序在这些情况下执行某种转换

我目前的工作 我所做的是在oracle数据库上运行两条update语句:

UPDATE store set PAYLOAD =  REPLACE(PAYLOAD, '"processState":"P"','"processState":"PARTIAL"') where PAYLOAD like '%"processState":"P"%';

UPDATE store set PAYLOAD =  REPLACE(PAYLOAD, '"processState":"C"','"processState":"COMPLETE"') where PAYLOAD like '%"processState":"C"%';
问题: 那么还有其他方法吗?我可以为这些特定情况添加一些反序列化/转换代码吗?有没有比运行replace-SQL语句更优雅的方法

我可以对一个特定的java子包进行一些黑客攻击,然后说“使用这个枚举而不是那个枚举…”或者使用其中一个?但不影响代码的其余部分

错误:
理想情况下,我们存储的是emum的值,而不是Enum。
因此,您应该保存枚举值,如COMPLETE、PARTIAL
对于JSON序列化和反序列化,请使用@JsonValue

@JsonValue
public String toValue() {
   return value;
}

实现一个JPA转换器,如下所示:

@Converter(autoApply = true)
public class ProcessStateConverter
        implements AttributeConverter<ProcessState, String> {


    private ImmutableBiMap<ProcessState, String> map = ImmutableBiMap.<ProcessState, String>builder()
            .put(COMPLETE, "C")
            .put(COMPRESSING, "P")
        .build();

    @Override
    public String convertToDatabaseColumn(ProcessState attribute) {
        return Optional.ofNullable(map.get(attribute))
                .orElseThrow(() -> new RuntimeException("Unknown ProcessState: " + attribute));
    }

    @Override
    public ProcessState convertToEntityAttribute(String dbData) {
        return Optional.ofNullable(map.inverse().get(dbData))
                .orElseThrow(() -> new RuntimeException("Unknown String: " + dbData));
    }
}

缺点是每次发生变化时都需要维护转换器。因此,最好创建一个单元测试,以检查所有内容是否正确映射。

发布了其他解决方案的一个附加解决方案:

   @JsonCreator
        public static ProcessState factory(String inputValue) {

        if(inputValue.length() == 1){

            for(ProcessState type : ProcessState.values()){
                if(inputValue.equals(type.getValue().substring(0,inputValue.length()))){
                    return type;
                }
            }
        }


        return ProcessState .valueOf(inputValue);
}

当有人否决投票时……至少发表评论,以理解背后的逻辑/原因
@JsonValue
public String toValue() {
   return value;
}
@Converter(autoApply = true)
public class ProcessStateConverter
        implements AttributeConverter<ProcessState, String> {


    private ImmutableBiMap<ProcessState, String> map = ImmutableBiMap.<ProcessState, String>builder()
            .put(COMPLETE, "C")
            .put(COMPRESSING, "P")
        .build();

    @Override
    public String convertToDatabaseColumn(ProcessState attribute) {
        return Optional.ofNullable(map.get(attribute))
                .orElseThrow(() -> new RuntimeException("Unknown ProcessState: " + attribute));
    }

    @Override
    public ProcessState convertToEntityAttribute(String dbData) {
        return Optional.ofNullable(map.inverse().get(dbData))
                .orElseThrow(() -> new RuntimeException("Unknown String: " + dbData));
    }
}
@Entity
public class MyEntity {

    @Column //no @Enumerated
    private ProcessState processState; 

    //...
}
   @JsonCreator
        public static ProcessState factory(String inputValue) {

        if(inputValue.length() == 1){

            for(ProcessState type : ProcessState.values()){
                if(inputValue.equals(type.getValue().substring(0,inputValue.length()))){
                    return type;
                }
            }
        }


        return ProcessState .valueOf(inputValue);
}