source

예기치 않은 json 반환, "_links"로 철자가 지정된 "links"가 있으며 Spring hateoas에서 구조가 다릅니다.

ittop 2023. 7. 26. 22:27
반응형

예기치 않은 json 반환, "_links"로 철자가 지정된 "links"가 있으며 Spring hateoas에서 구조가 다릅니다.

저는 객체를 있습니다.ProductResourceSupport그러나 제가 받은 응답은 "links"가 아닌 "_links" 속성을 가지고 있으며 다른 구조를 가지고 있습니다.

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

HATEOAS 참조를 기준으로 예상되는 것은 다음과 같습니다.

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

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

다음 스니펫을 통해 selfLink를 추가했습니다.

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"
}

기능을 은 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "spring-bootREST 예제(여기):

@EnableAutoConfiguration(exclude = HypermediaAutoConfiguration.class)

제가아한는,한는▁as,HypermediaAutoConfigurationHAL을 구성하는 것 외에는 별로 할 일이 없으므로 사용하지 않도록 설정해도 무방합니다.

Spring Boot now(전버=1.3.3).RELEASE에는 RELEASE의 .PagedResources.

을 다음구 만 하면 .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이런 식으로 주석을 달 수 있습니다.

HAL을 사용할 수 있는 경우 스프링 부트를 통해 선택됩니다("_links"는 HAL을 통해 얻을 수 있습니다).당신은 할 수 있어야 합니다.@EnableHypermediaSupport수동으로 설정하여 기본값을 재정의합니다.

개체를 반환하려고 할 때 적어도 리소스 지원 확장 대 개체를 포함하는 개체가 리소스 지원 확장을 반환할 때 문제가 발생한다는 것을 알게 되었습니다.리소스 지원 확장 개체의 목록 또는 배열을 반환해도 동일한 효과를 얻을 수 있습니다.예를 참조하십시오.

@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"
            }
        ]
    }
]

답의 구조를 바꾸는 것은 올바른 결정이 아니지만, 우리는 이런 식으로 더 깊이 생각하려고 노력할 수 있습니다.

문제를 , 즉, HAL 형식, HAL 형식을 예상했습니다._links하지만 항상 받았습니다.links 사하는기용을 사용하지만.@EnableAutoConfiguration.

제 문제에 대한 해결책이 여기에도 도움이 될 수 있습니다.및 의 "RestController에 두 가지 미디어 .@RequestMapping

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

와 함께@EnableAutoConfiguration는 Spring HATOAS의 합니다.application/hal+json오직 그리고 내 지원서에는 책임이 있는 다른 사람이 있었습니다.MediaType.APPLICATION_JSON_VALUE선정에서 우승하고 표준 JSON을 렌더링했습니다.

그래서 나의 해결책은 오직 셋팅입니다.produces="application/hal+json"Spring HATEOAS 객체 매퍼가 선택되도록 합니다.당신의 경우, 당신은 유지하도록 노력해야 합니다.MediaType.APPLICATION_JSON_VALUE

@RepositoryRestResource 주석과 함께 Spring 데이터를 사용하고 있을 것입니다.

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

기본 HAL 동작을 제거하려면 다음 주석 매개 변수를 추가할 수 있습니다.

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

위의 구성 Spring Data REST는 종속성 프로젝트의 모든 리포지토리에 명시적으로 주석을 달 필요 없이 상위 프로젝트의 리소스에 대한 rest endpoint만 표시합니다.

문서에 따라

특정 리포지토리, 쿼리 방법 또는 필드 숨기기 특정 리포지토리, 리포지토리의 쿼리 방법 또는 엔티티의 필드를 전혀 내보내지 않을 수 있습니다.예를 들어, 사용자 개체의 암호와 같은 필드 또는 유사한 중요 데이터를 숨깁니다.내보내기 도구에서 이러한 항목을 내보내지 않도록 하려면 @RestResource로 주석을 달고 내보낸 항목을 = false로 설정합니다.

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

@RepositoryRestResource(exported = false)
interface PersonRepository extends CrudRepository<Person, Long> {}

저도 '_links'라는 것을 받고 있었습니다.@RequestMapping에서 실수로 @RequestMapping("id")이 있어야 할 때 @RequestMapping("{id}")을 가져왔다는 것을 발견했습니다.

제가 그것을 고쳤을 때, '_links'라는 것이 사라졌습니다.

언급URL : https://stackoverflow.com/questions/25431087/returned-json-unexpected-has-links-spelled-as-links-and-structure-differen

반응형