Saltar al contenido

Devolver JSON como respuesta Spring Boot

Te recomendamos que revises esta resolución en un entorno controlado antes de pasarlo a producción, un saludo.

Solución:

Cambia tu clase de modelo como esta

@Entity
@Table(name="some_table")
public class SomeModel 

    @Id
    @Column(name="p_col", nullable=false)
    private Integer id;
    @Column(name="s_col")
    private String name
    @Column(name="t_col")
    private String json;   // this column contains json data

    @Column(name = "t_col", columnDefinition = "json")
    @Convert(attributeName = "data", converter = JsonConverter.class)
    private Map json = new HashMap<>();

    //constructors
    //getters and setters

Escriba una clase de convertidor json.

@Converter
public class JsonConverter
                    implements AttributeConverter> 



    @Override
    public Map convertToDatabaseColumn(String attribute)
    
        if (attribute == null) 
           return new HashMap<>();
        
        try
        
            ObjectMapper objectMapper = new ObjectMapper();
            return objectMapper.readValue(attribute, HashMap.class);
        
        catch (IOException e) 
        
        return new HashMap<>();
    

    @Override
    public String convertToEntityAttribute(Map dbData)
    
        try
        
            ObjectMapper objectMapper = new ObjectMapper();
            return objectMapper.writeValueAsString(dbData);
        
        catch (JsonProcessingException e)
        
            return null;
        
    

Convertirá la base de datos json attribute a los resultados de su deseo. Gracias

Necesitas definir tu json attribute como JsonNode para que jackson pueda leerlo hacia adelante y hacia atrás, pero la marca es como @Transient entonces JPA no intenta almacenarlo en la base de datos.

Luego puede codificar getter/setter para JPA, donde traduce de JsonNode a String hacia adelante y hacia atrás. Usted define un getter getJsonString que traducen JsonNode json a String. Ese se puede asignar a una columna de tabla, como ‘json_string’, luego define un setter donde recibe el String de JPA y analizarlo en JsonNode que estará disponible para jackson, jackson luego lo traducirá a un objeto json, no a un string como mencionas.

@Entity
@Table(name = "model")
public class SomeModel 

  private Long id;
  private String col1;

  //  Attribute for Jackson 
  @Transient
  private JsonNode json;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public Long getId() 
    return id;
  

  @Column(name ="col1")
  public String getCol1() 
    return col1;
  

  // Getter and setter for name

  @Transient
  public JsonNode getJson() 
    return json;
  

  public void setJson(JsonNode json) 
    this.json = json;
  

  // Getter and Setter for JPA use
  @Column(name ="jsonString")
  public String getJsonString() 
    return this.json.toString();
  

  public void setJsonString(String jsonString) 
    // parse from String to JsonNode object
    ObjectMapper mapper = new ObjectMapper();
    try 
      this.json = mapper.readTree(jsonString);
     catch (Exception e) 
      e.printStackTrace();
    
  

Aviso, @Column se definen en gettters porque necesitamos indicar JPA para usar getJsonString y JPA requiere consistencia, por lo que todos los captadores de columna deben marcarse con @Columns.

Aquí tienes las reseñas y calificaciones

Tienes la opción de añadir valor a nuestro contenido tributando tu veteranía en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *