Procedimento: Deserialização de enums

Introdução

Antes de começar vamos tomar como base o enum Cargo que é composto por GERENTE e EMPREGADO, lembrando que esta não é boa forma de modelar Cargo, utilizaremos este caso para fins didáticos.

Implemente a interface EnumSql e sobrescreva o método getSqlValue

public enum Cargo imlements EnumSql {
  
  GERENTE("G", "Gerente"),

  EMPREGADO("E", "Empregado");

  private final String codigo;

  private final String descricao;

  private Cargo(String codigo, String nome) {
    this.codigo = codigo;
    this.descricao = nome;
  }
  
  @Override
  public String getSqlValue() {
    return codigo;
  }
  
  public String getCodigo() {
    return codigo;
  }
  
  public String getDescricao() {
    return descricao;
  }
  
}

O método getSqlValue() por padrão deve retornar a propriedade codigo.

Adicione uma propriedade do tipo EnumSqlMap em seu enum

Abaixo da declaração dos tipos do enum defina uma propriedade do tipo EnumSqlMap.

public enum Cargo imlements EnumSql {
  
  GERENTE("G", "Gerente"),

  EMPREGADO("E", "Empregado");
  
  private static final EnumSqlMap<Cargo> codigoMap =
    EnumSqlMap.of(Cargo.class);

  private final String codigo;

  private final String descricao;

  private Cargo(String codigo, String nome) {
    this.codigo = codigo;
    this.descricao = nome;
  }
 
  public static Cargo load(String codigo) {
    return codigoMap.load(codigo);
  }

Por uma questão de padronização nomeie a propriedade como codigoMap, não se esquecendo de adicionar o método load() abaixo do construtor.

Crie a classe interna estática Serializer que extende JsonSerializer

public static class Serializer extends JsonSerializer<Cargo> {

  @Override
  public void serialize(Cargo value, JsonGenerator jgen, SerializerProvider provider)
    throws IOException, JsonProcessingException {
  }

}

Implemente o método serialize corretamente

@Override
public void serialize(Cargo value, JsonGenerator jgen, SerializerProvider provider)
  throws IOException, JsonProcessingException {

    jgen.writeStartObject();
    jgen.writeObjectField("name", value.name());
    jgen.writeObjectField("descricao", value.getDescricao());
    jgen.writeEndObject();

}

Utilize o método writeObjectField() para adicionar as propriedades name e descricao, cada uma ligada ao seu respectivo método.

Importante: O método name() chamado por value pertence à classe Enum, por isso o mesmo não está presente no arquivo fonte.

Adicione a anotação @JsonSerialize no enum

Esta anotção deve ficar acima da definição do enum em seu arquivo fonte

@JsonSerialize(using = Cargo.Serializer.class)
public enum Cargo implements EnumSql {

}

 
 

objectos, Fábrica de Software LTDA

  • R. Demóstenes, 627. cj 123
  • 04614-013 - Campo Belo
  • São Paulo - SP - Brasil
  • +55 11 5093-8640
  • +55 11 2359-8699
  • contato@objectos.com.br