4
respostas

Melhor maneira de manipular Json no SpringBoot

Preciso armazenar no banco de dados uma lista de String. Inicialmente eu havia pensado em um Array de String, mas estava meio difícil de mapear esse tipo no banco. Após algumas consultas me pareceu melhor trabalhar com o tipo Json.

Só não compreendi como mapear na classe e no record o tipo Json (tendo em vista que me parece não ser um tipo nativo do Java) e como o receberei no corpo da requisição. Alguém teria uma sugestão? Desde já agradeço!

4 respostas

Oi Edson, se você deseja armazenar uma lista de strings no banco de dados e está considerando o uso do tipo JSON, você pode utilizar bibliotecas externas, como o Jackson, para mapear o tipo JSON em sua classe Java.

Aqui está um exemplo de como você pode fazer isso usando o Jackson:

  1. Adicione a dependência do Jackson ao seu projeto. Se estiver usando o Maven, adicione o seguinte código ao seu arquivo pom.xml:
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.13.0</version>
</dependency>
  1. Em sua classe, crie um campo para armazenar a lista de strings como um tipo List<String>:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class MinhaClasse {
    private List<String> minhaLista;

    // getters e setters

    // Converte o objeto para JSON
    public String toJson() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(this);
    }

    // Converte o JSON para objeto
    public static MinhaClasse fromJson(String json) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(json, MinhaClasse.class);
    }
}
  1. Ao receber uma requisição com o corpo contendo o JSON, você pode usar o método fromJson para converter o JSON em um objeto Java:
// Exemplo de uso no contexto de uma requisição HTTP usando Spring MVC
@PostMapping("/exemplo")
public ResponseEntity<?> exemplo(@RequestBody String json) {
    try {
        MinhaClasse minhaClasse = MinhaClasse.fromJson(json);
        // Faça algo com o objeto minhaClasse
        return ResponseEntity.ok("Objeto convertido com sucesso!");
    } catch (JsonProcessingException e) {
        return ResponseEntity.badRequest().body("Erro ao converter JSON para objeto");
    }
}

Com essas modificações, você poderá enviar uma lista de strings no corpo da requisição como um JSON e convertê-lo para um objeto Java em sua aplicação.

Lembre-se de importar as classes necessárias e ajustar o código conforme o contexto da sua aplicação.

Espero que isso ajude! Bons Estudos!

Certo, até aqui entendido, mas no meu caso aqui, eu criei em minha Entity um atributo private ArrayList<String> lote;. Nesse caso, o JPA criou no banco um campo lote do tipo "varbinary(255)".

Para que eu tenha no banco (MySql) o tipo Json, eu devo criar na minha Entity esse atributo como sendo do tipo Json, para que o JPA crie da maneira correta? E em qual momento eu devo converter os dados String (lista) vindos do corpo da requisição para Json e vice-versa?

Sim, para armazenar o tipo JSON no banco de dados MySQL, você precisa fazer algumas modificações em sua entidade. Em vez de usar o tipo ArrayList<String> para o atributo lote, você pode usar o tipo JsonNode do pacote com.fasterxml.jackson.databind. Isso permite que você trabalhe com dados JSON de forma mais fácil e eficiente.

Aqui está um EXEMPLO de como você pode fazer isso:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.persistence.*;

@Entity
public class MinhaEntidade {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(columnDefinition = "json")
    private JsonNode lote;

    // getters e setters

    // Converte o objeto para JSON
    public String toJson() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(this);
    }

    // Converte o JSON para objeto
    public static MinhaEntidade fromJson(String json) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(json, MinhaEntidade.class);
    }
}

Nesse exemplo, o atributo lote é declarado como JsonNode e anotado com @Column(columnDefinition = "json") para indicar que o tipo do campo no banco de dados é JSON.

Para converter os dados do tipo ArrayList<String> para JSON e vice-versa, você pode usar os métodos toJson() e fromJson() fornecidos na classe.

Por exemplo, ao receber uma requisição com o corpo contendo o JSON, você pode usar o método fromJson para converter o JSON em um objeto Java do tipo MinhaEntidade, e ao salvar no banco de dados, o JPA irá converter automaticamente o objeto JsonNode em JSON para armazenamento.

Lembre-se de importar as classes necessárias, como JsonNode, ObjectMapper e as anotações Entity, Id, GeneratedValue, Column, entre outras, e ajustar o código conforme o contexto da sua aplicação.

Espero que isso ajude! Se tiver mais alguma dúvida, estou à disposição.

Fiz conforme o sugerido acima e está gerando o seguinte erro:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Could not determine recommended JdbcType for `com.fasterxml.jackson.databind.JsonNode`

Como eu poderia solucionar esse erro? Alguém pooderia me dar uma ajuda? Desde já obrigado!