【问题标题】:enforce enum serialization with a spring jpa projection?使用 spring jpa 投影强制枚举序列化?
【发布时间】:2022-02-01 10:15:31
【问题描述】:

假设我有以下 JPA 实体,枚举字段 ON/OFF 映射到 SQL 枚举(“on”,“off”)。

@Entity
public class Process {
    @Id
    private Long Id;
    @Convert(converter = StatusConverter.class)
    private Status status;

    // getter/setter omitted
}

public enum Status {
    ON("on"),
    OFF("off");

    private final String status;

    Status(String status) {
        this.status = status;
    }

    // JSON (de)serialization
    @JsonCreator
    public static Status decode(String status) {
        return valueOf(status.toUpperCase());
    }

    @JsonValue
    public getStatus() {
        return status;
    }

    // DAO layer conversion
    public String toDatabaseColumn() {
        return this.name().toLowerCase();
    }
}

@Converter
public class StatusConverter implements AttributeConverter<Status, String> {
    @Override
    public String convertToDatabaseColumn(Status attribute) {
        return attribute.toDatabaseColumn();
    }

    @Override
    public Status convertToEntityAttribute(String dbData) {
        return Status.decode(dbData);
    }
}

// Spring JPA projection
public interface ProcessSummary {
    String getStatus();
}

// a minimalist JPA repository
public interface ProcessRepository extends Repository<Process, Long> {
    <T> T findById(Long id, Class<T> type;
}

如果我在 REST 控制器中使用 repository.findById(1L, Process.class),DAO 层转换和 JSON 序列化都按预期工作:

  • 我的数据库记录的状态设置为on
  • 映射到Java Status.ON
  • 实体被序列化为
    {
        "status" : "on" 
    }

但如果我改用repository.findById(1L, ProcessSummary.class),实体会被序列化为

    {
        "status" : "ON" 
    }

使用投影作为目标类型时,如何获得相同的结果?是否可以使用投影,或者我应该尝试其他方法(可能是 DTO 类)?

【问题讨论】:

    标签: spring jackson spring-data


    【解决方案1】:

    对不起,伙计们,这只是我和 PEBKAC 的教科书案例 :)

    接口中的 getStatus() 方法必须返回一个状态,而不是一个字符串。

    public interface ProcessSummary {
        String getStatus();
    }
    

    按要求做:将枚举转换为字符串,因此Status.ON 被序列化为"ON",而

    public interface ProcessSummary {
        Status getStatus();
    }
    

    确实使用了@JsonValue注解的方法,将Status.ON序列化为"on"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-31
      • 2018-11-25
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      相关资源
      最近更新 更多