복붙노트

[SPRING] Spring Data REST를 사용하면 @Version 속성이 ETag가되고 표현에 포함되지 않는 이유는 무엇입니까?

SPRING

Spring Data REST를 사용하면 @Version 속성이 ETag가되고 표현에 포함되지 않는 이유는 무엇입니까?

Spring Data REST (Spring Boot 1.3.3을 통해)에서 사람들의 리소스 컬렉션을 가져 오면 @Version 속성은 리소스에 포함되지 않습니다.

$curl -v http://localhost:8080/api/people/1
*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /api/people/1 HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.42.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< ETag: "0"
< Last-Modified: Tue, 26 Apr 2016 00:08:12 GMT
< Content-Type: application/hal+json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Tue, 26 Apr 2016 00:12:56 GMT
< 
{
  "id" : 1,
  "createdDate" : {
    "nano" : 351000000,
    "epochSecond" : 1461629292
  },
  "lastModifiedDate" : {
    "nano" : 351000000,
    "epochSecond" : 1461629292
  },
  "firstName" : "Bilbo",
  "lastName" : "Baggins",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/api/people/1"
    },
    "person" : {
      "href" : "http://localhost:8080/api/people/1"
    }
  }
* Connection #0 to host localhost left intact

기본적으로 또는 스프링 데이터 저장소를 구성 할 때 :

@Configuration
public class ApplicationRepositoryConfiguration 
    extends RepositoryRestMvcConfiguration 
{    
    @Override
    protected void configureRepositoryRestConfiguration(
        RepositoryRestConfiguration config
        ) 
    {
        config.exposeIdsFor(Person.class);
        config.setBasePath("/api/");
    }
}

@Version은 업데이트 할 때 증가하는 데이터 행의 버전이며, 특정 리소스를 쿼리 할 때 ETag HTTP 헤더 데이터에 포함됩니다. 컬렉션의 각 리소스에서 GET을 호출하는 대신 GET 콜렉션에서 @Version을 얻는 것이 더 좋을 것입니다. 따라서 응용 프로그램에서 각 리소스 업데이트의 @Version 값을 확인하기 위해 GET을 수행 할 필요가 없습니다. 여행.

@Version 필드를 컬렉션의 각 리소스에 포함시키는 방법이 있습니까?

엔티티 정의는 다음과 같습니다.

@Data @Entity @EntityListeners(AuditingEntityListener.class)
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @CreatedDate
    @Column(nullable=false)
    private Instant createdDate;

    @LastModifiedDate
    @Column(nullable=false)
    private Instant lastModifiedDate;

    @Version
    @JsonProperty
    private Long version;

    …
}

해결법

  1. ==============================

    1.아니 없어. ETag는 백엔드에서 @Value 속성으로 표현 된 것과 동등한 HTTP입니다. Spring 데이터 REST는 HTTP 프로토콜의 해당 메커니즘이있는 모든 백엔드 관련 등록 정보를 URI로 변환합니다. 즉, ID는 URI가되고 페이로드의 일부가 아니어야하며 @LastModifiedDate 등록 정보는 헤더, @Version 등록 정보, ETags가됩니다.

    아니 없어. ETag는 백엔드에서 @Value 속성으로 표현 된 것과 동등한 HTTP입니다. Spring 데이터 REST는 HTTP 프로토콜의 해당 메커니즘이있는 모든 백엔드 관련 등록 정보를 URI로 변환합니다. 즉, ID는 URI가되고 페이로드의 일부가 아니어야하며 @LastModifiedDate 등록 정보는 헤더, @Version 등록 정보, ETags가됩니다.

    이유는 간단합니다. HTTP를 사용하는 경우 데이터 액세스 수준에서 구현되는 것을 달성하기 위해 사용할 수있는 프로토콜 수단을 사용하십시오. 이것이 Spring Data REST가 데이터베이스를 웹에 단순히 노출시키는 것이 아니라 실제로 모델을 검사하고 모델 특성을 프로토콜 별 방법으로 변환하는 한 측면입니다.

    긴 이야기 : Spring Data REST를 사용하면 두 가지 업데이트 옵션을 사용할 수 있습니다.

    유사한 최적화가 GET 요청에 대해 만들어 질 수 있습니다.

  2. from https://stackoverflow.com/questions/36853343/with-spring-data-rest-why-is-the-version-property-becoming-an-etag-and-not-inc by cc-by-sa and MIT license