Почему свойство версии не установлено с помощью Spring Data JPA?

Хотел узнать, как аннотация @Version в Spring Data REST используется для ETag, по какой-то причине я не вижу заполненных ETag

@Entity
@EntityListeners(AuditingEntityListener.class)
public class Venue implements Serializable {

  private static final long serialVersionUID = -5516160437873476233L;

  private Long id;

  ...
  // other properties

  private Long version;

  private Date lastModifiedDate;

  // getters & setters

  @JsonIgnore
  @LastModifiedDate
  public Date getLastModifiedDate() {
    return lastModifiedDate;
  }

  @Version
  @Column
  public Long getVersion() {
    return version;
  }

Судя по документам, это должно дать мне значение Etag? как видно на фрагменте из библиотеки

protected HttpHeaders prepareHeaders(PersistentEntity<?, ?> entity, Object value) {

    // Add ETag
    HttpHeaders headers = ETag.from(entity, value).addTo(new HttpHeaders());

    // Add Last-Modified
    AuditableBeanWrapper wrapper = getAuditableBeanWrapper(value);

однако, учитывая объект и следующую конфигурацию, я все равно получаю значение null для версии. Мое приложение имеет следующее

@SpringBootApplication
@EnableEntityLinks
@EnableJpaAuditing
public class GabbarSinghApplication

И репозиторий Rest выглядит следующим образом

@RepositoryRestResource(collectionResourceRel = "venue", path = "venues")
public interface VenueRepository extends JpaRepository<Venue, Long> {

Хотя мне еще не приходилось тестировать эти методы с заголовками и т. д., простой запрос POST на http://localhost:8080/workshops дает 500 из-за исключения нулевого указателя при получении значения заголовка ETag из значения свойства версии.

Обновить

Перемещенный в @javax.persistence.Version для сущностей, я все еще не получаю заголовок ETag в заголовках ответов.

Вот неудачный модульный тест

  @Before
  public void setUp() throws Exception {

    XStream xstream = new XStream();
    ObjectInputStream in = xstream.createObjectInputStream(venuesXml.getInputStream());
    leela = (Venue) in.readObject();
    paul = (Venue) in.readObject();
    taj = (Venue) in.readObject();
    LOGGER.debug("Initialised Venues from xml file {}", venuesXml.getFilename());

  }

  @Test
  public void testEtagHeaderIsAutoGeneratedOnResourceCreation() {

    final HttpEntity<Venue> httpEntity = new HttpEntity<Venue>(taj, headers);

    ResponseEntity<ResourceSupport> response = restTemplate.exchange(BASE_LOCATION
        + VENUES_ENDPOINT, HttpMethod.POST, httpEntity,
        new ParameterizedTypeReference<ResourceSupport>() {
        });

    assertTrue("Response should contain ETag header", null != response.getHeaders().getETag());

Это утверждение не работает.


person Anadi Misra    schedule 07.08.2015    source источник
comment
Я знаю, что это было давно, но я столкнулся с той же проблемой... Вы поняли это?   -  person Fred    schedule 13.11.2015


Ответы (2)


Я столкнулся с той же проблемой, и спустя часы и часы я понял следующие вещи, которые привели меня к просветлению =P

  1. Spring Data Rest обеспечивает поддержку ETag для управления оптимистичным параллелизмом ТОЛЬКО после версии 2.3.0. См. об этой ошибке, опубликованной около года назад. Предыдущие версии Spring Data Rest НЕ будут заполнять заголовок ETag.
  2. Для приложений Spring Boot (в нашем случае) вам необходимо использовать Spring Boot 1.3.0.BUILD-SNAPSHOT или выше, чтобы иметь возможность настроить spring-boot-starter-data-rest, который зависит от Spring Data Rest 2.4.1. (выше 2.3.1, что нам и нужно :P).

В моем случае я использовал Spring Boot 1.2.7, и всякий раз, когда я устанавливал зависимость spring-boot-starter-data-rest, я получал Spring Data Rest 2.2.0, который не поддерживает ETag. После обновления Spring Boot в моем проекте и переустановки зависимостей мой REST API начал извлекать заголовок ETag = D

person Augusto Altman Quaranta    schedule 16.11.2015

С Spring Data JPA вам нужно использовать @javax.persistence.Version. @org.springframework.data.annotation.Version — это аннотация для других модулей Spring Data.

person Oliver Drotbohm    schedule 07.08.2015
comment
Спасибо за это, обновил вопрос, ETag все еще не заполнен. - person Anadi Misra; 09.08.2015
comment
Оливер — в документах здесь говорится об использовании тега SDC @ Version. docs.spring.io/spring-data/rest/docs /текущая/ссылка/html. Вы правы в том, что вам нужно использовать JPA @ Version, так что это ошибка документа. Отправлю вопрос, когда вернусь домой. - person ; 15.04.2016