Spring Data Rest发布到收集端点

时间:2015-05-31 09:40:05

标签: spring spring-data-jpa spring-data spring-data-rest

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

我有一个事件对象,它与预订对象有一对多的关系,如下所示

事件:

@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
}

EventRepository:

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);
}

BookingRepository

public interface BookingRepository extends JpaRepository<Booking, Long>{

}

这些揭示了端点:

/休息/事件 /休息/预订

事件的实例:

/ rest / events / 1

预订:

/休息/事件/ 1 /预订

我想要实现的目标是创建一个新的预订并将其与活动相关联。我的数据模型将event_id作为必填字段(因为没有事件就预订没有意义),而我身上的每一根光纤都说我应该发布一个新的预订对象/ rest / events / 1 /预订并让它创建一个与id为1的事件相关联的新预订对象。但是,每当我尝试发布到该URI时,我都会收到消息:

  

无法加载资源:服务器响应状态为405   (不允许的方法)

在检查端点/休息/事件/ 1 /预订的标题时,我可以看到该帖子是允许的:

  

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

所以现在我完全迷茫,不知所措。感觉我应该能够以这种方式创建预订,而且我真的不想沿着必须创建孤立预订的路线,然后将其与事件相关联,因为它会破坏我的数据模型(拥有在预订中使event_id为null),并且没有办法对事务中的操作进行操作(是吗?)。我已尝试在我的模型中对其他集合进行类似的操作,并且他们也发布了拒绝的帖子,所以我猜测它与我的弹簧数据休息配置有关,但我没有&#39不知道是什么。

提前感谢您提供任何帮助或指示。

3 个答案:

答案 0 :(得分:1)

将您的新预订发布到:/rest/bookings

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

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

答案 1 :(得分:0)

这不是弹簧支架配置的问题,如下所示thread。我的理解是Spring休息不支持你试图做的方式

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

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

答案 2 :(得分:0)

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

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

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