第二次保存具有引用同一父亲的子属性的Object时发生Spring Rest错误:id已经有POJO



我正在尝试使用Spring 3,Jackson 4.0中的REST控制器,使用PUT方法更新对象。

我们有一个Container类,它有4个属性与Container的一对多关系。

  @JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@Id",scope = Container.class)
    public class Container implements Comparable, Serializable {
     private int containerId;
    .
    .
    .
    private Set<Container> containers;
    private Collection<ImagePerContainer> imageControls;
    private Collection<TextControl> textControls;
    private Collection<PromoControl> promoControls;
    private Collection<WebSource> webSourceControls;
    }

每个对象(子对象)都有一个容器(父对象)的引用,如下所示:

 @JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@Id",scope = TextControl.class)
    public class TextControl implements Serializable {
    .
    .
    .
        private int textControlId;
        private String textControlName;
        private Container container;
    .
    .
    .
    }

当我的angularjs应用程序使用$resources PUT请求修改模型时,我正在尝试更新对象。第一次成功保存,但第二次我从服务器收到400响应,服务器记录了这个错误:

HandlerMethod details: 
Controller [com.bamboo.catW3.web.json.ContainerController]
Method [public org.springframework.http.ResponseEntity<com.bamboo.catW3.domain.Container> com.bamboo.catW3.web.json.ContainerController.updateContainer(int,com.bamboo.catW3.domain.Container)]
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Already had POJO for id (java.util.UUID) [com.fasterxml.jackson.annotation.ObjectIdGenerator$IdKey@8adc3c85] (through reference chain: com.bamboo.catW3.domain.Container["@Id"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Already had POJO for id (java.util.UUID) [com.fasterxml.jackson.annotation.ObjectIdGenerator$IdKey@8adc3c85] (through reference chain: com.bamboo.catW3.domain.Container["@Id"])
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:171)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:163)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:135)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:180)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:95)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:123)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)

如果我更新另一个容器,它也是第一次工作,但如果我再次修改并尝试更新,它会给我同样的400错误。它甚至没有进入控制器。如果我重新启动服务器,它会让我更新对象一次,然后它就会再次停止工作。

为什么它只在第一次工作?我该怎么解决这个问题?

我遇到了同样的问题,刚刚发现了这个链接:

https://github.com/FasterXML/jackson-databind/issues/499

它说这是jackson 2.4.0中的一个错误,在2.4.1及更高版本中被修复。

只需将您的jackson库更新到最新的稳定版本即可。

最新更新