Skip to main content
 首页 » 编程设计

java之在数据库中读取/写入 POJO 作为 JSON 字符串

2024年06月20日194jpfss

这个问题我找了两天,没有找到合适的解决方案。

我有一个带有表的 PostgreSQL 数据库:

CREATE TABLE mytable (key text PRIMARY KEY, content text) 

此外,我有一个带有 JPA 实体类的 Java SpringBoot 应用程序:

@Entity 
@Table(name = "mytable") 
public class MyEntity { 
 
  @Id 
  private String key; 
 
  // tell JPA to convert MyPojo to JSON using the default Jackson ObjectMapper 
  private MyPojo content; 
 
  // constructors, getters, setters 
 
} 

MyPojo 类包含涉及基本类型、映射、列表和其他嵌套 POJO 类的子结构。为 MyPojo 类和所有其他嵌套的 POJO 类编写转换器似乎并不方便。相反,我想使用 Jackson 对其进行序列化/反序列化。

如何配置 Jackson/JPA 将 MyPojo 对象作为 JSON 字符串存储在数据库表的文本字段中?我希望有一个合适的注释,例如 @Convert(converter=Jackson.ObjectMapper)。向 MyEntity 类引入额外的 String 字段是另一种行不通的方法。

我成功地使用 Jackson 将 MyPojo 对象作为 JSON 字符串发送/解析到 REST 接口(interface),但我正在努力将相同的字符串放入数据库的文本字段中。

请您参考如下方法:

您可以定义一个转换器在 Pojo 和 JSON 之间进行转换,并使用 Jackson 进行转换:

@Converter 
public class MyPojoToJsonConverter implements AttributeConverter<MyPojo, String>{ 
 
    ObjectMapper objectMapper = new ObjectMapper(); 
 
    @Override 
    public String convertToDatabaseColumn(MyPojo myPojo) { 
        String json = ""; 
        try { 
            json = objectMapper.writeValueAsString(myPojo); 
        } catch (JsonProcessingException jpe) { 
            // Handle exception 
        } 
        return json; 
    } 
 
    @Override 
    public MyPojo convertToEntityAttribute(String myPojoAsJson) { 
        MyPojo myPojo = null; 
        try { 
            myPojo = objectMapper.readValue(myPojoAsJson, MyPojo.class); 
        } catch (JsonParseException e) { 
            // HandleException 
        } catch (JsonMappingException e) { 
            // HandleException 
        } catch (IOException e) { 
            // HandleException 
        } 
        return myPojo; 
    } 
} 

然后您可以使用@Convert 注释在实体的属性中设置此转换器:

@Entity 
@Table(name = "mytable") 
public class MyEntity { 
 
    @Id 
    private String key; 
 
    @Convert(converter=MyPojoToJsonConverter.class) 
    private MyPojo content; 
}