Spring Data Rest 2.1.0无法发布或放置复杂资源
问题内容:
编辑:这似乎也在PUT中发生。
使用spring-data-rest-webmvc版本2.1.0.BUILD-
SNAPSHOT我发现我无法发布具有指向现有资源的关系的资源。我有2个这样的实体,它们需要实例化引用,并且对它们的两个端点之一进行POST都会导致以下行为。
在没有必需引用的情况下发布资源效果很好。
我做了一些挖掘,PersistentEntityResourceHandlerMethodArgumentResolver
发现它看起来还MappingJackson2HttpMessageConverter
不错,但是最终在检查ObjectMapper
can
是否可以反序列化类型时抛出异常。引起异常的原因是NullPointerException
。
带/ reservations关系的示例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" : [] }
响应:
{ 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!" }
与/ roomGroups无关的POST:
{ "description" : "All Rooms", "isOffNetwork" : false, "roomGroupType" : "STANDARD" }
响应:
201 Created
我正在发布的JSON是否存在问题,导致产生NPE
ObjectMapper
?有某种解决方法吗?这在2.0.0.RC1中为我工作,使用了稍微不同的方案在JSON中包括引用链接,并且由于杰克逊依赖项的版本似乎保持不变,所以我想知道是什么导致了此问题…
谢谢你的帮助!
更新:
现在,此问题 似乎 与关联实体无关…
我创建了一个新的@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"}
。
但是,我仍然收到与此@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<>();
我不确定这堂课有什么特别之处,导致事情出了问题…
问题答案:
问题如下:
这两个不可发布的实体都有一个称为的属性,_abstract
因为它是Java中的保留字。我命名了这个属性的getter和setter
getAbstract()
和setAbstract()
分别。
由于getter和setter与预期的属性名称不匹配,因此Jackson似乎引发了空指针异常。
当我将属性名称更改为,resvAbstract
并将访问器更新为时getResvAbstract()
,setResvAbstract()
所有内容组合在一起并开始工作。
我仍然对导致此问题出现的更改感到好奇,但我很高兴它正在起作用!