Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用Jackson解决循环依赖项错误,而不使用注释_Spring_Jackson_Circular Dependency - Fatal编程技术网

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

Spring 使用Jackson解决循环依赖项错误,而不使用注释,spring,jackson,circular-dependency,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();

目前,我正在使用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.
    ...
}
通过使用注释,我可以很容易地解决这个问题:

但这不是我的观点

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


提前感谢您的建议

最后,我找到了Mixin注释来解决循环问题,而不涉及现有的POJO

此处有Minin注释的参考:

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

  • 将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>
    
  • 实现混合模块

    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类上的所有注释都将应用于目标类。

    能否向我们展示您的控制器处理程序方法?您是否只需使用
    @ResponseBody
    ?@hsotirios delimanolis感谢您的回复。我只是简单地使用了
    @ResponseBody
    作为返回值,仅此而已。@Fify如果您使用xml配置,请尝试将默认的lazy init=“true”添加到bean中,看看它是否有效。@Rembo可以更详细地向我解释为什么这样可以解决循环依赖性问题?我在春季MVC是个新手。谢谢。写一个自定义的{de,}序列化程序?虽然我不知道如何告诉Spring使用它。。。
    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);
        }
    }