在数据库中读/写POJO作为JSON字符串

时间:2018-03-28 12:37:25

标签: java json jpa spring-boot jackson

我现在正在搜索这个问题两天,没有适当的解决方案。

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

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

此外,我有一个带有JPA实体类的Java SpringBoot-Application:

@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)。向String类引入额外的MyEntity字段是另一种无效的方法。

我成功地使用Jackson将MyPojo个对象作为JSON字符串发送/解析到REST接口,但是我很难将相同的字符串放入数据库的文本字段中。

2 个答案:

答案 0 :(得分:1)

您可以定义转换器以在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;
}

答案 1 :(得分:0)

MyPojo应该是一个字符串而不是您实体中的对象。把你的JSON放在String中,应该是全部。