Решите ошибку циклических зависимостей с Джексоном, не используя аннотации


В настоящее время я пишу некоторое веб-приложение, используя Spring framework. Для всех API @ RestController я использую 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 2

1 ответ:

Наконец, я нашел аннотации Mixin, чтобы решить круг, не касаясь существующего POJO.

Здесь имеется ссылка на аннотации Минина: http://wiki.fasterxml.com/JacksonMixInAnnotations

Ниже приведены краткие инструкции по использованию Mixin:
  1. Добавьте ObjectMapper в ваш web-spring-сервлет.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 будут применены к целевому классу.