[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.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.HAL을 사용할 수있는 경우 봄 부팅 (및 "_links"는 HAL과 함께 사용)으로 선택됩니다. @EnableHypermediaSupport를 수동으로 기본값을 덮어 쓸 수 있어야합니다.
HAL을 사용할 수있는 경우 봄 부팅 (및 "_links"는 HAL과 함께 사용)으로 선택됩니다. @EnableHypermediaSupport를 수동으로 기본값을 덮어 쓸 수 있어야합니다.
-
==============================
3.또 다른 옵션은 전체 하이퍼 미디어 자동 구성 기능을 비활성화하는 것입니다 (이것은 spring-boot + REST 예제 중 하나에서 수행됩니다).
또 다른 옵션은 전체 하이퍼 미디어 자동 구성 기능을 비활성화하는 것입니다 (이것은 spring-boot + REST 예제 중 하나에서 수행됩니다).
@EnableAutoConfiguration(exclude = HypermediaAutoConfiguration.class)
지금까지 내가 아는 한, HypermediaAutoConfiguration은 HAL을 구성하는 것을 제외하고는 실제로 많이하지 않기 때문에 사용하지 않도록 설정해야합니다.
-
==============================
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.나는 최근에 반대의 문제를 겪었습니다. 즉, @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.@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> {}
from https://stackoverflow.com/questions/25431087/returned-json-unexpected-has-links-spelled-as-links-and-structure-differen by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 주석을 사용하여 파일 속성 읽기 (0) | 2019.03.27 |
---|---|
[SPRING] NULL을 반환하는 싱글 톤과 @Autowired (0) | 2019.03.27 |
[SPRING] org.hibernate.LazyInitializationException : 프록시를 초기화 할 수 없습니다 - 세션 없음 (0) | 2019.03.27 |
[SPRING] Ehcache의 로깅을 설정하는 방법 (0) | 2019.03.27 |
[SPRING] Java 기반 어노테이션을 사용하여 구성된 Spring MVC를 사용하여 전역 적으로 404 개의 예외를 처리하는 방법 (0) | 2019.03.27 |