2014-02-20 2 views
2

현재 스프링 프레임 워크를 사용하여 일부 webapp를 작성하고 있습니다. 모든 @RestController API의 경우 Jackson을 사용하여 Json 객체를 생성합니다. 두 물체가 양방향 참조있을 때 순환 종속성 문제가 주석을 사용하지 않고 Jackson과의 순환 종속성 오류를 해결합니다.

@RestController 
@RequestMapping("/api") 
public class SomeAPI { 
    @RequestMapping(method = RequestMethod.GET) 
    public A getA() { 
     A a = new A(); 
     return a; 
    } 
} 

싶지만

@RestController 보인다.

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

을하지만 그건 내 말이 아니다 예를 들어, 다음과 같이 두 개의 POJO 클래스가 있습니다.

이제 A 및 B 클래스의 코드를 변경할 수 없으므로 주석을 사용할 수 없습니다. 그러면 주석을 사용하지 않고이 문제를 어떻게 해결할 수 있습니까?

미리 조언 해 주셔서 감사합니다.

+0

컨트롤러 처리기 방법을 보여줄 수 있습니까? 단지'@ ResponseBody'를 사용합니까? –

+0

@ hsotirios-delimanolis 답장을 보내 주셔서 감사합니다. 반환 값으로'@ ResponseBody'를 사용한 것뿐입니다. – Fify

+0

@Fify 당신이 xml 설정을 사용하고 있다면 bean에 default-lazy-init = "true"를 추가하고 작동하는지 확인해보십시오. – Rembo

답변

2

마지막으로, 기존의 POJO를 건드리지 않고 원형을 풀기 위해 Mixin Annotation을 찾았습니다. http://wiki.fasterxml.com/JacksonMixInAnnotations

다음은 믹스 인 사용하는 간단한 단계입니다 : 여기 Minin에 주석의 참조가

  1. 웹 스프링-servlet.xml 파일에 ObjectMapper를 추가

    <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 구현

  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 클래스의 모든 주석이 대상 클래스에 적용됩니다.