我正在尝试使用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库更新到最新的稳定版本即可。