2014-03-03 68 views
0

編輯:這似乎也發生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<>(); 

我不知道有什麼特別之處這個類是造成事情出差錯......

+0

您是否有機會添加領域模型的相關部分?隨意瀏覽[測試用例| 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並查看它與您的設置有何不同。 –

回答

0

問題如下所示:

這兩個非可展示實體都有一個名爲_abstract的屬性,因爲它是Java中的保留字。我已經分別爲這個屬性getAbstract()setAbstract()命名了getter和setter。

Jackson似乎一直在拋出空指針異常,因爲getter和setter與預期的屬性名稱不匹配。

當我將屬性名稱更改爲resvAbstract並將訪問者更新爲getResvAbstract()setResvAbstract()時,所有內容都彙集在一起​​並開始工作。

我仍然對導致此問題的變化感到好奇,但我很高興它正在工作!

+0

請接受您的答案爲正確答案,以便我們輕鬆看到問題已經解決。看[接受答案](http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work)。 ;) – bluish