Spring 使用Jackson解决循环依赖项错误,而不使用注释
目前,我正在使用Spring框架编写一些webapp。对于所有@RestController API,我使用Jackson生成Json对象 @RestController看起来像Spring 使用Jackson解决循环依赖项错误,而不使用注释,spring,jackson,circular-dependency,Spring,Jackson,Circular Dependency,目前,我正在使用Spring框架编写一些webapp。对于所有@RestController API,我使用Jackson生成Json对象 @RestController看起来像 @RestController @RequestMapping("/api") public class SomeAPI { @RequestMapping(method = RequestMethod.GET) public A getA() { A a = new A();
@RestController
@RequestMapping("/api")
public class SomeAPI {
@RequestMapping(method = RequestMethod.GET)
public A getA() {
A a = new A();
return a;
}
}
但当两个对象具有双向引用时,存在循环依赖问题。例如,有两个POJO类,如下所示:
class A {
private B b;
// constructor
...
// setters and getters.
...
}
class B {
private A a;
// constructor
...
// setters and getters.
...
}
通过使用注释,我可以很容易地解决这个问题:
但这不是我的观点
现在,我无法更改A和B类的代码,因此无法在它们中使用任何注释那么,不使用注释如何解决此问题?
提前感谢您的建议 最后,我找到了Mixin注释来解决循环问题,而不涉及现有的POJO 此处有Minin注释的参考: 以下是使用Mixin的简要步骤:
<bean id="myFrontObjectMapper" class="my.anying.web.MyObjectMapper"></bean>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="myObjectMapper"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
public class MixinModule extends SimpleModule {
private static final long serialVersionUID = 8115282493071814233L;
public MixinModule() {
super("MixinModule", new Version(1, 0, 0, "SNAPSHOT", "me.anying",
"web"));
}
public void setupModule(SetupContext context) {
context.setMixInAnnotations(Target.class, TargetMixin.class);
}
}
现在,TargetMixin类上的所有注释都将应用于目标类。能否向我们展示您的控制器处理程序方法?您是否只需使用
@ResponseBody
?@hsotirios delimanolis感谢您的回复。我只是简单地使用了@ResponseBody
作为返回值,仅此而已。@Fify如果您使用xml配置,请尝试将默认的lazy init=“true”添加到bean中,看看它是否有效。@Rembo可以更详细地向我解释为什么这样可以解决循环依赖性问题?我在春季MVC是个新手。谢谢。写一个自定义的{de,}序列化程序?虽然我不知道如何告诉Spring使用它。。。
public class MixinModule extends SimpleModule {
private static final long serialVersionUID = 8115282493071814233L;
public MixinModule() {
super("MixinModule", new Version(1, 0, 0, "SNAPSHOT", "me.anying",
"web"));
}
public void setupModule(SetupContext context) {
context.setMixInAnnotations(Target.class, TargetMixin.class);
}
}