Spring JPA Projection, включая ссылки

Учитывая простую модель события, которая имеет набор объектов бронирования:

Событие:

@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 Booking() {
      // for JPA
   }
   // Getters and setters omitted for brevity
}

У каждого есть интерфейс JpaRepository, и я создал проекцию, чтобы включать детали бронирования при получении события.

@Projection(name="with-booking", types=Event.class)
public interface EventWithBookingProjection {

    public Date getStart();
    public Date getEnd();
    public String getTitle();
    public List<Booking> getBookings();
}

Это работает в том смысле, что заказы возвращаются правильно, однако объект бронирования не имеет своего объекта _links, как если бы я извлек их самостоятельно. Как я могу получить объекты резервирования со связанными с ними ссылками, чтобы выполнять операции с извлеченными объектами резервирования?

то есть вместо:

{  
   "id":1,
   "title":"Test Title",
   "bookings":[  
      {  
         "title":"Test 1",
         "contact":"Contact 1"
      },
      {  
         "title":"Test 2 ",
         "contact":"Contact 2"
      }
   ],
   "end":"2015-06-06T11:30:00.000+0000",
   "start":"2015-06-06T09:00:00.000+0000",
   "_links":{  
      "self":{  
         "href":"http://localhost:8080/rest/events/1{?projection}",
         "templated":true
      },
      "bookings":{  
         "href":"http://localhost:8080/rest/events/1/bookings"
      }
   }
}

Я хочу получить:

    {  
   "id":1,
   "title":"Test Title",
   "bookings":[  
      {  
         "title":"Test 1",
         "contact":"Contact 1",
         "_links":{  
            "self":{  
               "href":"http://localhost:8080/rest/bookings/23{?projection}",
               "templated":true
            },
            "event":{  
               "href":"http://localhost:8080/rest/bookings/23/event"
            }
         }
      },
      {  
         "title":"Test 2 ",
         "contact":"Contact 2",
         "_links":{  
            "self":{  
               "href":"http://localhost:8080/rest/bookings/24{?projection}",
               "templated":true
            },
            "event":{  
               "href":"http://localhost:8080/rest/bookings/24/event"
            }
         }
      }
   ],
   "end":"2015-06-06T11:30:00.000+0000",
   "start":"2015-06-06T09:00:00.000+0000",
   "_links":{  
      "self":{  
         "href":"http://localhost:8080/rest/events/1{?projection}",
         "templated":true
      },
      "bookings":{  
         "href":"http://localhost:8080/rest/events/1/bookings"
      }
   }
}

person Drew    schedule 06.06.2015    source источник


Ответы (1)


Это было решено в последнем выпуске моментального снимка spring-data, и ссылки включены по умолчанию. При обновлении моего POM для включения показанных ниже ссылок на встроенные коллекции появились

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-rest-webmvc</artifactId>
        <version>2.4.0.M1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons</artifactId>
        <version>1.11.0.M1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-rest-core</artifactId>
        <version>2.4.0.M1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.9.0.M1</version>
    </dependency>
person Drew    schedule 08.06.2015
comment
Я использую Spring Data REST с Spring Boot 1.2.8 и выпуском Gosling-SR4, и я не могу получить связанный объект в проекции, чтобы иметь атрибуты _links. Вы все еще видите это поведение по умолчанию? - person Marc Zampetti; 01.03.2016
comment
Я не могу комментировать эту версию, в настоящее время я использую весеннюю загрузку 1.3.2.RELEASE, в которой есть компоненты весенних данных 2.4.2.RELEASE, и появляется атрибут _links. Вы можете перейти на более новую версию Spring Boot? - person Drew; 02.03.2016
comment
Я не могу перейти на Spring Boot 1.3.x, но использую Spring Data Rest 2.4.4.RELEASE. Версия Spring Boot не имеет значения, но это может быть связано с другими зависимостями. - person Marc Zampetti; 03.03.2016