복붙노트

[SPRING] 예기치 않은 반환 된 json은 "_links"로 철자가 지정된 "링크"와 구조가 서로 다릅니다 (Spring hateoas에서).

SPRING

예기치 않은 반환 된 json은 "_links"로 철자가 지정된 "링크"와 구조가 서로 다릅니다 (Spring hateoas에서).

제목에서 알 수 있듯이 ResourceSupport를 확장하는 Resource 객체 Product가 있습니다. 그러나 내가받는 응답에는 "링크"대신 "_links"속성이 있고 다른 구조를 가지고 있습니다.

{
  "productId" : 1,
  "name" : "2",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/products/1"
    }
  }
}

HATEOAS Reference를 기반으로 예상되는 내용은 다음과 같습니다.

{
  "productId" : 1,
  "name" : "2",
  "links" : [
    {
      "rel" : "self"
      "href" : "http://localhost:8080/products/1"
    }
  ]
}

이게 의도 된거야? 그것을 바꿀 수있는 방법이 있습니까, 아니면 적어도 구조가 아니라면 "링크"입니까?

다음 스 니펫을 통해 셀프 링크를 추가했습니다.

product.add(linkTo(ProductController.class).slash(product.getProductId()).withSelfRel());

다음 빌드 파일과 함께 스프링 부트를 사용하고 있습니다.

dependencies {
    compile ("org.springframework.boot:spring-boot-starter-data-rest") {
        exclude module: "spring-boot-starter-tomcat"
    }

    compile "org.springframework.boot:spring-boot-starter-data-jpa"
    compile "org.springframework.boot:spring-boot-starter-jetty"
    compile "org.springframework.boot:spring-boot-starter-actuator"

    runtime "org.hsqldb:hsqldb:2.3.2"

    testCompile "junit:junit"
}

해결법

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

    1.Spring Boot now (version = 1.3.3.RELEASE)는 PagedResources의 출력 JSON 형식을 제어하는 ​​속성을 가지고 있습니다.

    Spring Boot now (version = 1.3.3.RELEASE)는 PagedResources의 출력 JSON 형식을 제어하는 ​​속성을 가지고 있습니다.

    application.yml 파일에 다음 설정을 추가하기 만하면됩니다.

    spring.hateoas.use-hal-as-default-json-media-type: false
    

    결과물이 질문과 같이 (질문에 따라) 필요하면 :

    {
      "productId" : 1,
      "name" : "2",
      "links" : [
        {
          "rel" : "self"
          "href" : "http://localhost:8080/products/1"
        }
      ]
    }
    

    편집 됨 :

    그런데이 방법으로 @EnableSpringDataWebSupport 어노테이션 만 필요합니다.

  2. ==============================

    2.HAL을 사용할 수있는 경우 봄 부팅 (및 "_links"는 HAL과 함께 사용)으로 선택됩니다. @EnableHypermediaSupport를 수동으로 기본값을 덮어 쓸 수 있어야합니다.

    HAL을 사용할 수있는 경우 봄 부팅 (및 "_links"는 HAL과 함께 사용)으로 선택됩니다. @EnableHypermediaSupport를 수동으로 기본값을 덮어 쓸 수 있어야합니다.

  3. ==============================

    3.또 다른 옵션은 전체 하이퍼 미디어 자동 구성 기능을 비활성화하는 것입니다 (이것은 spring-boot + REST 예제 중 하나에서 수행됩니다).

    또 다른 옵션은 전체 하이퍼 미디어 자동 구성 기능을 비활성화하는 것입니다 (이것은 spring-boot + REST 예제 중 하나에서 수행됩니다).

    @EnableAutoConfiguration(exclude = HypermediaAutoConfiguration.class)
    

    지금까지 내가 아는 한, HypermediaAutoConfiguration은 HAL을 구성하는 것을 제외하고는 실제로 많이하지 않기 때문에 사용하지 않도록 설정해야합니다.

  4. ==============================

    4.문제가 적어도 ResourseSupport 객체를 포함하는 객체를 확장 할 때 객체를 반환하려고 할 때 나타납니다. ResourseSupport를 확장하는 객체를 포함하는 객체입니다. ResourseSupport를 확장하고 동일한 효과를 갖는 객체의 List 또는 Array도 반환 할 수 있습니다. 다음 예제를 참조하십시오.

    문제가 적어도 ResourseSupport 객체를 포함하는 객체를 확장 할 때 객체를 반환하려고 할 때 나타납니다. ResourseSupport를 확장하는 객체를 포함하는 객체입니다. ResourseSupport를 확장하고 동일한 효과를 갖는 객체의 List 또는 Array도 반환 할 수 있습니다. 다음 예제를 참조하십시오.

    @RequestMapping(method = GET, value = "/read")
    public NfcCommand statusPayOrder() {
        return generateNfcCommand();
    }
    

    응답이있다 :

    {
        "field": "123",
        "_links": {
            "self": {
                "href": "http://bla_bla_bla_url"
            }
        }
    }
    

    목록으로 감싸려고 할 때 :

    @RequestMapping(method = GET, value = "/read")
    public List<NfcCommand> statusPayOrder() {
        return Arrays.asList(generateNfcCommand());
    }
    

    점점 :

    [
        {
            "field": 123
            "links": [
                {
                    "rel": "self",
                    "href": "http://bla_bla_bla_url"
                }
            ]
        }
    ]
    

    대답의 구조 변화는 올바른 결정이 아니지만 우리는이 방법을 더 생각하려고 노력할 수 있습니다.

  5. ==============================

    5.나는 최근에 반대의 문제를 겪었습니다. 즉, @EnableAutoConfiguration을 사용하지만 HAL 양식 (예 : _links)이 예상되었지만 항상 링크가 있습니다.

    나는 최근에 반대의 문제를 겪었습니다. 즉, @EnableAutoConfiguration을 사용하지만 HAL 양식 (예 : _links)이 예상되었지만 항상 링크가 있습니다.

    내 문제에 대한 해결책이 여기서도 도움이 될 수 있습니다. 발견 된 예제에서 복사하여 붙여 넣기 때문에 RestController 's @RequestMappingannotation에 두 개의 mediatype이 있습니다.

    @RequestMapping(path="/example", produces = {MediaType.APPLICATION_JSON_VALUE, "application/hal+json"})
    

    @EnableAutoConfiguration With Spring HATEOAS는 application / hal + json에 대해서만 ObjectMapper를 등록하고, 내 애플리케이션에는 MediaType.APPLICATION_JSON_VALUE에 대한 책임이있는 또 다른 것이있다.

    그래서 내 해결책은 Spring HATEOAS 객체 매퍼가 선택되도록 "application / hal + json"만 생성합니다. 귀하의 경우에는 MediaType.APPLICATION_JSON_VALUE을 유지해야합니다.

  6. ==============================

    6.@RepositoryRestResource 주석을 사용하여 Spring 데이터를 사용하고 있다고 확신합니다.

    @RepositoryRestResource 주석을 사용하여 Spring 데이터를 사용하고 있다고 확신합니다.

    @RepositoryRestResource    
    public interface XX extends CrudRepository<AA, String>
    

    기본 HAL 비헤이비어를 제거하려면 다음 주석 매개 변수를 추가 할 수 있습니다.

    @RepositoryRestResource(exported = false)
    public interface XX extends CrudRepository<AA, String>
    

    위의 구성 Spring Data REST는 종속 프로젝트의 모든 저장소에 명시 적으로 주석을 추가하지 않고도 부모 프로젝트의 리소스에 대한 나머지 끝점 만 표시합니다.

    문서 당

    특정 리포지토리, 쿼리 메서드 또는 필드 숨기기 특정 저장소, 저장소의 조회 메소드 또는 엔티티 필드가 전혀 반출되지 않도록 할 수 있습니다. 예를 들어 User 객체의 암호 또는 유사한 민감한 데이터와 같은 필드 숨기기가 있습니다. 수출업자에게 이러한 품목을 수출하지 말라고 말하면, @RestResource로 주석을 달고 exported = false로 설정하십시오.

    예를 들어 리포지토리 내보내기를 건너 뛰려면 다음과 같이하십시오.

    @RepositoryRestResource(exported = false)
    interface PersonRepository extends CrudRepository<Person, Long> {}
    
  7. from https://stackoverflow.com/questions/25431087/returned-json-unexpected-has-links-spelled-as-links-and-structure-differen by cc-by-sa and MIT license