关山初度尘未洗,策马扬鞭再奋蹄!这篇文章主要讲述Jackson ObjectMapper给出了递归数据类型的错误相关的知识,希望能为你提供帮助。
我有pojo DTNodo
,它有一个递归属性List<
DTNodo>
。当我尝试使用jackson生成json模式时,我得到一个java.lang.StackOverflowError
异常。
如果我删除List属性它工作正常,所以问题在于递归。
有没有办法告诉ObjectMapper这个递归,所以它正确处理它?有没有其他方法来生成这个json架构?
【Jackson ObjectMapper给出了递归数据类型的错误】DTNodo类
public class DTNodo implements Serializable {private static final long serialVersionUID = 1L;
private Integer idNodo;
private String codigo;
private String descripcion;
private String detalle;
private Integer orden;
private List<
DTNodo>
hijos;
public Integer getIdNodo() {
return idNodo;
}public void setIdNodo(Integer idNodo) {
this.idNodo = idNodo;
}public String getCodigo() {
return codigo;
}public void setCodigo(String codigo) {
this.codigo = codigo;
}public String getDescripcion() {
return descripcion;
}public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}public String getDetalle() {
return detalle;
}public void setDetalle(String detalle) {
this.detalle = detalle;
}public Integer getOrden() {
return orden;
}public void setOrden(Integer orden) {
this.orden = orden;
}public List<
DTNodo>
getHijos() {
return hijos;
}public void setHijos(List<
DTNodo>
hijos) {
this.hijos = hijos;
}}
我用来生成jsonschema的代码
public static String getJsonSchema(Class<
?>
clazz) {
ObjectMapper mapper = new ObjectMapper();
JsonSchema schema;
try {
schema = mapper.generateJsonSchema(clazz);
return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema);
} catch (IOException e) {
return "Error al generar JsonSchema: " + e.getMessage();
}
}
答案不推荐使用ObjectMapper.generateJsonSchema。你会想要使用the new JSON schema module。
将
com.fasterxml.jackson.module:jackson-module-jsonSchema:${jacksonVersion}
添加到项目中并生成如下架构:ObjectMapper mapper = new ObjectMapper();
JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper);
JsonSchema schema = schemaGen.generateSchema(clazz);
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema);
确保从正确的包中导入现代JsonSchema:
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
另一答案没有简单的方法。您应该尽量避免序列化导致POJO中的引用循环的属性。
您可以实现类似以下示例(对象序列化为引用),但您必须确保客户端应用程序能够反序列化它:
{
"id": "1",
"name": "John",
"friends": [
{
"id": "2",
"name": "Jared",
"friends": [
{
"$ref": "1"
}
]
}
}
我要做的是序列化父对象,而没有导致循环的属性(
@JsonIgnore
)。然后序列化其余部分并使客户端应用程序重新组合对象。你可以使用
@JsonManagedReference
,@JsonBackReference
。更多信息:http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion
推荐阅读
- 解决方案(从C#app调用Crystal Report导致“数据库登录失败”或“加载报告失败”)
- Android java测试浮动负值和正值不起作用吗()
- Settings.Secure.ANDROID_ID在构建APK和签名APK中为何不同()
- Struts 2 - 没有映射名称空间[/]的动作和与上下文路径[/ LoginApplication]相关联的动作名称[validateLogin]
- ActionMapper类在struts 2中的作用是什么
- 执行新的runnables时丢失ApplicationContext
- 在Winforms中使用带有C#的InputSimulator以正确的方式模拟按键
- 如何在Symfony 3中为Guzzle创建PSR-6文件系统缓存
- 如何在Atom编辑器中保存时删除结尾的空格