Решите ошибку циклических зависимостей с Джексоном, не используя аннотации
В настоящее время я пишу некоторое веб-приложение, используя 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 ответ:
Наконец, я нашел аннотации Mixin, чтобы решить круг, не касаясь существующего POJO.
Здесь имеется ссылка на аннотации Минина: http://wiki.fasterxml.com/JacksonMixInAnnotations
Ниже приведены краткие инструкции по использованию Mixin:
Добавьте 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>
Реализовать MyObjectMapper
public class MyObjectMapper extends ObjectMapper { public MyObjectMapper() { this.registerModule(new MixinModule()); } }
Реализовать 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); } }
Сделано.
Теперь все аннотации класса TargetMixin будут применены к целевому классу.