我有一个json文件,里面有json对象作为属性值:
{
"name": "name",
"json": {...}
}
我需要在RestController中自动获取它,并在JPA Hibernate中将其作为实体使用。
我的实体是:
更新-
@Entity
@Table(name = "collections")
public class Collection {
@Id
private String name;
@Column(name = "cache_limit")
private int limit;
@Column(name = "cache_algorithm")
private String algorithm;
@Transient
private JsonNode schema;
@JsonIgnore
@Column(name ="json_schema")
private String jsonSchema;
public Collection() {
}
public String getJsonSchema() {
return schema.toString();
}
public void setJsonSchema(String jsonSchema) {
ObjectMapper mapper = new ObjectMapper();
try {
schema = mapper.readTree(jsonSchema);
} catch (IOException e) {
throw new RuntimeException("Parsing error -> String to JsonNode");
}
}
..setters and getters for name limit algorithm schema..
}
当我使用实体管理器.持久化(集合)
时,我json_schema
列为空
我该如何解决?问题出在 setJsonSchema() 中
更新:
public String getJsonSchema() {
return jsonSchema;
}
public void setJsonSchema(JsonNode schema) {
this.jsonSchema = schema.toString();
}
这样的getter/setter不能解决问题
无需将逻辑放入实体setter/getter即可创建响应,无需第三方依赖:
ObjectNode node = JsonNodeFactory.instance.objectNode();
node.put("name", cat.getName());
node.set("json", new ObjectMapper().readTree(cat.getJson()));
return Response.ok(node).build();
如本文所述,您不必手动创建自定义Hibernate Type,因为您可以使用以下依赖项通过Maven Central获得它:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
有关更多信息,请查看Hibernate Types开源项目。
然后你可以简单地声明你的类的新类型。
@TypeDef(
name = "jsonb-node",
typeClass = JsonNodeBinaryType.class
)
实体映射将如下所示:
@Type(type = "json-node")
@Column(columnDefinition = "json")
private JsonNode json;
您可以将JsonNode json
属性定义为@Transient
,这样JPA就不会尝试将其存储在数据库中。然而,杰克逊应该能够把它前后翻译给杰森。
然后可以为JPA编写getter/setter代码,这样就可以前后转换JsonNode到String。您定义了一个gettergetJsonString
,它将JsonNode json
>转换为
。这一个可以映射到一个表列,如“json_string”,然后定义一个setter,在这里您可以从JPA接收
string
,并将其解析到可供jackson使用的JsonNode。
不要忘记将< code>@JsonIgnore添加到< code>getJsonString中,这样Jackson就不会试图将json转换为JsonString。
@Entity
@Table(name = "cats")
public class Cat {
private Long id;
private String name;
@Transient
private JsonNode json;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
@Column(name ="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setId(Long id) {
this.id = id;
}
// Getter and setter for name
@Transient
public JsonNode getJson() {
return json;
}
public void setJson(JsonNode json) {
this.json = json;
}
@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();
}
}
}
我在通过邮递员传递json数据时遇到问题。如果Mandetory日期带有注释,没问题。另一个日期接受null。但是在更新时,该日期会产生问题。我使用Java1.8与Spring启动 以下链接我已经访问过,但不适合这个。杰克逊JSON解析错误的LocalDateTime解析:无法构造java.time.LocalDate的实例:没有String参数构造函数/工厂方法从String值反序列化https
问题内容: 我有一个Spring MVC Servlet,我需要从JavaScript前端Web应用程序接受JSON。要解析JSON,我需要使用Jackson。我需要获取JSON中的值并将它们按在JSON中出现的顺序存储到列表中。我尝试过将JsonFactory与JsonParser和JsonNode对象一起使用,但是可以使其正常工作。我也尝试过打开BufferedReader并逐行遍历请求正文,
我正在学习SpringBoot,在参考文档中有一个例子,我有一个问题。文件的以下部分提到 6.使用@SpringBootApplication注释 可以使用单个@SpringBootApplication注释来启用这三个功能,即: @EnableAutoConfiguration:启用Spring Boot的自动配置机制 @ComponentScan:在应用程序所在的包上启用@Component扫
我正在使用来解析Json数据。我的Json数据如下: GsonParse.java 我使用以下方法来解析此JSON数据。 我面对以下错误。
18. 使用@SpringBootApplication注解 许多Spring Boot开发者总是使用@Configuration、@EnableAutoConfiguration和@ComponentScan来注解他们的主类。由于这些注解经常地被一起使用(特别是当您遵循上述的最佳实践),所以Spring Boot提供了一个方便的替代注解@SpringBootApplication。 @Sprin
许多Spring Boot开发人员喜欢他们的应用程序使用自动配置,组件扫描,并能够在他们的“应用程序类”上定义额外的配置。 单个@SpringBootApplication注释可用于启用这三个功能,即: @EnableAutoConfiguration: 启用Spring Boot的自动配置机制 @ComponentScan: 在应用程序所在的包上启用@Component扫描(请参阅最佳实践) @