Java 处理更改的枚举定义-数据库 介绍
首席架构师在spring boot项目中更改了枚举定义 发件人: 致: 处理这个问题的正确方法是什么?其他一些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
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);
}