編輯:這似乎也發生PUTs以及。春季數據休息2.1.0不能POST或PUT複雜資源
使用spring-data-rest-webmvc版本2.1.0.BUILD-SNAPSHOT我發現我無法使用指向已有資源的關係發佈資源。我有2個這樣的實體需要參考實例化,併發布到他們的任何一個端點導致下面的行爲。
在不需要引用的情況下發布資源效果很好。
我做了一些挖掘,看起來PersistentEntityResourceHandlerMethodArgumentResolver
發現MappingJackson2HttpMessageConverter
很好,但它最終在檢查ObjectMapper
是否可以反序列化類型時拋出異常。異常的原因是NullPointerException
。
例如POST瓦特/關係到/保留:
{ "description" : "test_post", "dateMade" : "2014-03-03T08:04:44.293-0600", "timeLastChanged" : null, "userLastChanged" : null, "courseTypeId" : null, "numCredits" : null, "instructor" : null, "numParticipants" : null, "reservationType" : "MCU", "status" : "REQUESTED", "abstract" : null, "requestor" : "http://localhost:8080/users/2", "submitter" : "http://localhost:8080/users/2", "conferences" : [] }
RESPONSE:
{ cause: null message: "No suitable HttpMessageConverter found to read request body into object of type class domain.Reservation from request with content type of application/json!" }
POST瓦特/沒有關係到/ roomGroups:
{ "description" : "All Rooms", "isOffNetwork" : false, "roomGroupType" : "STANDARD" }
迴應:
201 Created
有什麼錯的JSON我張貼這是導致從ObjectMapper
的NPE?有什麼解決方法嗎?這在2.0.0.RC1中爲我工作,使用稍微不同的方案來包含JSON中的引用鏈接,並且由於傑克遜依賴關係的版本似乎保持不變,所以我不知道是什麼導致此問題...
感謝您的幫助!
UPDATE:
這個問題現在看來未相關的關聯實體...
我創建了一個新的@Entity
ConnectionRequest如下:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "CONNECTION_REQUEST_ID")
private Long id;
@Column(name = "FROM_ENTITY_ID", nullable = false)
private Long fromId;
@Column(name = "TO_ENTITY_ID", nullable = false)
private Long toId;
@Convert(converter = EntityTypeConverter.class)
@Column(name = "FROM_ENTITY_TYPE_ID", nullable = false)
private EntityType fromType;
@Convert(converter = EntityTypeConverter.class)
@Column(name = "TO_ENTITY_TYPE_ID", nullable = false)
private EntityType toType;
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
@JoinColumn(name = "CONFERENCE_ID", nullable = false)
private Conference conference;
我可以張貼具有包含在json中的會議關係的新ConnectionRequest記錄,如{"conference" : ".../conferences/1"}
。
不過,我仍然得到同樣的異常W /本@Entity
預訂:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "RESERVATION_ID")
private Long id;
@Column(name = "DESCRIPTION", length = 50, nullable = false)
private String description;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "DATE_MADE", nullable = false)
private Date dateMade;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "TIME_LAST_CHANGED")
private Date timeLastChanged;
@Column(name = "USER_LAST_CHANGED")
private Integer userLastChanged; // TODO why is this an int?
@Column(name = "ABSTRACT", length = 2000)
private String _abstract;
@Column(name = "COURSE_TYPE_ID")
private Integer courseTypeId;
@Column(name = "NUMBER_OF_CREDITS")
private Integer numCredits;
@Column(name = "INSTRUCTOR", length = 255)
private String instructor;
@Column(name = "NUMBER_OF_PARTICIPANTS")
private Integer numParticipants;
@Convert(converter = ReservationTypeConverter.class)
@Column(name = "RESERVATION_TYPE_ID", nullable = false)
private ReservationType reservationType;
@Convert(converter = StatusConverter.class)
@Column(name = "STATUS_ID")
private Status status;
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
@JoinColumn(name="REQUESTOR_USER_ID", nullable=false)
private User requestor;
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
@JoinColumn(name="SUBMITTER_USER_ID", nullable=false)
private User submitter;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "reservation", cascade = {CascadeType.REMOVE})
private Set<Conference> conferences = new HashSet<>();
我不知道有什麼特別之處這個類是造成事情出差錯......
您是否有機會添加領域模型的相關部分?隨意瀏覽[測試用例| https://github.com/spring-projects/spring-data-rest/blob/master/spring-data-rest-webmvc/src/test/java/org/springframework/ data/rest/webmvc/jpa/DataRest262Tests.java#L85]添加到DATAREST-262並查看它與您的設置有何不同。 –