Spring 数据休息 post 到 collection end-point

Spring Data Rest post to collection end-point

我有一个我认为相当简单的问题,但经过几个小时的搜索可以找到解决方案,而且我对 Spring 还比较陌生,所以请原谅任何不正确的术语或明显的错误。

我有一个活动 object,它与预订 object 有 one-to-many 关系,如下所示

事件:

@Entity
public class Event {

   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   private Long eventId;
   private Date start;
   private Date end;
   private String title;

   @OneToMany(mappedBy="event")
   private Set<Booking> Bookings;

   protected Event() {
       // for JPA
   }
   // Getters and setters omitted for brevity
}

预订:

@Entity
public class Booking {  

   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   private Long bookingId;
   private String title;
   private String contact;

   @ManyToOne
   @JoinColumn(name="event_id", nullable=false)
   private Event event; 

   public DiveBooking() {
      // for JPA
   }
   // Getters and setters omitted for brevity
}

事件库:

public interface DiveEventRepository extends JpaRepository<Event, Long> {

List<Event> findByStartBetweenOrEndBetween(
        @Param("start") Date startStartTime,
        @Param("end") Date startEndTime,
        @Param("start") Date endStartTime,
        @Param("end") Date endEndTime);
}

预订资料库

public interface BookingRepository extends JpaRepository<Booking, Long>{

}

这些公开端点:

/rest/events /rest/bookings

一个事件的实例为:

/rest/events/1

其预订量:

/rest/events/1/预订

我想要实现的是创建一个新的预订并将其与一个事件相关联。我的数据模型将 event_id 作为必填字段(因为没有事件的预订毫无意义),我体内的每根纤维都说我应该能够 post 一个新的预订 object 到 /rest/events/1/bookings 并让它创建一个与 ID 为 1 的事件关联的新预订 object。但是,每当我尝试 post 到该 URI,我收到消息:

Failed to load resource: the server responded with a status of 405 (Method Not Allowed)

检查端点 /rest/events/1/bookings 的 headers 时,我可以看到 post 是允许的:

Access-Control-Allow-Methods:POST, GET, OPTIONS, DELETE

所以我现在完全是一头雾水,一头雾水。感觉我应该能够以这种方式创建预订,而且我真的不想沿着必须创建孤立预订然后将其与事件相关联的路线走下去,因为它会破坏我的数据模型(必须使event_id null in booking),并且没有办法在交易中执行这些操作(是吗?)。我已经尝试在我的模型中对其他 collections 进行类似的操作,但它们也被 post 拒绝,所以我猜这与我的 spring 数据剩余配置有关,但是不知道是什么

在此先感谢您对此的任何帮助或指点。

这不是您的 spring 其余配置的问题,如下 thread 所示。我的理解是 Spring rest

不支持您尝试的方式

根据给定 here,您必须使用以下内容来更新资源,这意味着您必须更新模型。

curl -v -X PUT -H "Content-Type: text/uri-list" -d "http://localhost:8080/events/1" http://localhost:8080/bookings/1/event

/rest/events/1/bookings是一个关联资源。它只能处理 URI。

如果您想创建一个新的 Booking,那么 post 到 /rest/bookings 有点合乎逻辑。 event 字段应包含关联事件的 URI,例如/rest/events/1.

顺便说一句:Access-Control-Allow-Methods 不一定表示 API 支持 的方法。它仅与跨域浏览器请求相关,并且每个 URL.

的值很可能相同

Post 您的新预订:/rest/bookings

{
  "title": "my booking title",
  "contact": "my contact",
  "event": "http:localhost:8080/rest/events/1"
}

正如其他人已经回答的那样,您可以创建一个预订,然后通过对 /rest/events/1/bookings 执行 PUT (text/uri-list) 将其关联到一个事件,但我认为上述方法更多懂事。