spring - 使用 Jackson 解决循环依赖错误,无需使用注释

标签 spring jackson circular-dependency

目前,我正在使用 Spring 框架编写一些 web 应用程序。对于所有 @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 类的代码,因此我无法在其中使用任何注释。 那么如何在不使用注解的情况下解决这个问题呢?

预先感谢您的任何建议!

最佳答案

最后,我找到了 Mixin Annotations 来解决循环问题,而无需触及现有的 POJO。

这里有 Minin 注解的引用: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. 完成。

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

关于spring - 使用 Jackson 解决循环依赖错误,无需使用注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21896408/

相关文章:

java - 如何使用 jackson 解析具有可变数量的第二个分数的 RFC3339 时间戳

java - 如何使用 Jackson 序列化和反序列化对象列表

python - 单独文件中的 FastAPI/Pydantic 循环引用

c++ - 如何在需要提及需要循环声明的其他类的类中初始化变量?

java - Spring MVC 或 Spring Boot 可以与 Amazon Alexa 配合使用吗?

java - Spring缓存抽象——分布式环境

java - JUnit 测试用例失败 : java. lang.AssertionError : expected null, 但为:<null>

design-patterns - "controller"和 "gui"之间的循环依赖

java - 如何在 Spring-Cloud-Stream 中配置重新连接到 Kafka

spring - 不要在某些网址上使用 session