使用Jackson解决循环依赖性错误,而不使用注释

时间:2014-02-20 01:45:36

标签: 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();
        return a;
    }
}

但是当两个对象具有双向引用时存在循环依赖性问题。例如,有两个POJO类如下:

class A {
    private B b;

    // constructor
    ...
    // setters and getters.
    ...
}


class B {
    private A a;

    // constructor
    ...
    // setters and getters.
    ...
}

我可以通过这种方式轻松解决,使用注释:http://java.dzone.com/articles/circular-dependencies-jackson

但那不是我的观点。

现在,我无法更改A和B类的代码,因此我无法在其中使用任何注释。 那么如何在不使用注释的情况下解决此问题?

提前感谢任何建议!

1 个答案:

答案 0 :(得分:2)

最后,我找到了Mixin Annotations来解决圆形而不触及现有的POJO。

这里有Minin Annotations的参考:http://wiki.fasterxml.com/JacksonMixInAnnotations

以下是使用Mixin的简要步骤:

  1. 将ObjectMapper添加到web-spring-servlet.xml

    <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>
    
  2. 实现MyObjectMapper

    public class MyObjectMapper extends ObjectMapper {
        public MyObjectMapper() {
            this.registerModule(new MixinModule());
        }
    }
    
  3. 实施MixinModule

    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);
        }
    }
    
  4. 完成。

  5. 现在,TargetMixin类上的所有注释都将应用于Target类。