我构建了我的第一个Spring-Controller单元测试,一个Controller以JSON格式返回一个对象。关系用@JsonIgnore注释,它可以在我的软件中使用。
当我只想测试那些控制器时,我将总是在该属性上得到无限递归错误。这是一个1:1的关系。在其他关系上,@ JsonIgnore没有任何问题。
错误测试: save(package.a.b.c.test.ControllerATest):请求处理失败;嵌套异常是org.springframework.http.converter.HttpMessageNotWritableException:无法写入JSON:无限递归(StackOverflowError)(通过引用链:package.abcentity.A [“b”] - > package.abcB [“a”]等...
看起来像我的@JsonIgnore在测试范围内被忽略了?
这是一个Maven管理的项目,所以我包括这样的
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
也许,有人也有同样的经历?
答案 0 :(得分:0)
是字段上的注释还是它们的吸气剂? Jackson默认只查看getter,因此将注释移动到getter将解决问题。例如:
class Person {
@JsonIgnore
Set<Department> departments;
public Set<Department> getDepartments() { return this.departments; }
}
class Department {
@JsonIgnore
Set<Person> persons;
public Set<Person> getPersons() return this.persons; }
}
如果Person
和Department
对象相互引用,将导致无限递归。
以下内容可行:
class Person {
Set<Department> departments;
@JsonIgnore
public Set<Department> getDepartments() { return this.departments; }
}
class Department {
Set<Person> persons;
@JsonIgnore
public Set<Person> getPersons() return this.persons; }
}
答案 1 :(得分:0)
我刚刚发现,它与物体中的双向1:1关系有关。切换到具有以下依赖项的较新版本2.3.1解决了该问题:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.1</version>
</dependency>