Защо свойството версия не е зададено с Spring Data JPA?

Исках да знам как се използва @Version анотация в Spring Data REST за ETags, не виждам ETags попълнени по някаква причина

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

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

@SpringBootApplication
@EnableEntityLinks
@EnableJpaAuditing
public class GabbarSinghApplication

А Rest Repository е както следва

@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 /current/reference/html. Вие сте прав, че все пак трябва да използвате JPA @ версия, така че това е грешка в документа. Ще изпратя проблем, когато се прибера. - person ; 15.04.2016