gpt4 book ai didi

java - 将 Jackson JsonNode 嵌入存储在 CrudRepository 中的 POJO 中

转载 作者:太空宇宙 更新时间:2023-11-04 14:41:43 25 4
gpt4 key购买 nike

这就是我现在所处的位置。我有一个接受 JSON 内容的 MVC Controller 方法。因为我需要使用 JSON 架构对其进行验证,所以我的 Controller 将请求正文映射为 Jackson JsonNode。

验证成功后,我需要将数据保留在 Spring Couchbase 存储库中。考虑以下代码片段:

public class Foo
{
@Id
private String _id;

@Version
private Long _rev;

@Field
private JsonNode nodeData;

// .. Other data and members.
}


//
// Repository
//

@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
}

当我将这些元素存储到 Couch 存储库中时,我希望看到的是这样的:

{
"_class": "Foo",
"field1": "field 1 data",
"nodeData" : {
"Some" : "additional data",
"from" : "JsonNode"
}
}

相反,我在存储库中看到的是这样的:

{
"_class": "Foo",
"field1": "field 1 data",
"nodeData" : {
"_children": {
"Some": {
"_value": "additional data",
"_class": "com.fasterxml.jackson.databind.node.TextNode"
},
"From": {
"_value": "jsonNode",
"_class": "com.fasterxml.jackson.databind.node.TextNode"
},
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
}
}

JsonNode 的每个存储属性都用类信息和其他元数据进行修饰,这是不可取的。

我的问题 - 是否有一种首选方法可以让 CrudRepository 以我希望的方式运行?

最佳答案

它不会那样工作,因为序列化和反序列化约定已经建立。您可以在 Jackson 中使用自定义序列化和反序列化来覆盖这些约定 - 但这可能超出您正在寻找的“原始”方法。

我发现您想要一种适合所有数据建模的方法。

我可以建议存储 map

@Field
private Map<String, String> data;

这张 map 是私有(private)的,所以非常完美。

然后你可以有两种方法

一种方法像这样放入 map

ObjectMapper mapper = new ObjectMapper()

public void setFeild(String name, Object value) {

ObjectNode node new ObjectNode(JsonNodeFactory.instance);
node.put("clazz", value.getClass().getName());
if (value instance of String) {
node.put("value", value)
} else {
node.put("value", mapper.writeValueAsString(data));
}
data.put(name, node.toString());

}

另一个像这样从 map 中获取

public Object getField(String name) {

if (data.contains(name)) {
JsonNode node = mapper.readValue(data.get(name), JsonNode.class);
Class clazz = Class.forName(node.get("class").textValue());
if (clazz.equals(String.class) {
return node.get("value").textValue();
} else {
return (Object) mapper.readValue(node.get("value"), clazz);
}
}

}

您应该更新此实现来处理日期、整数、 boolean 值、 double ...等,就像我处理字符串一样——POJO 是您对 json 进行序列化/反序列化的内容。

我希望这是有道理的。

关于java - 将 Jackson JsonNode 嵌入存储在 CrudRepository 中的 POJO 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24857499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com