这个问题我找了两天,没有找到合适的解决方案。
我有一个带有表的 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;
}