REST 와 함께 Spring을 사용하는 방법에 대한 다양한 예를 살펴 보았습니다 . 우리의 최종 목표는 Spring HATEOAS/HAL
설정입니다.
Spring 내에서 REST 를 렌더링하는 두 가지 별개의 방법을 보았습니다.
-
통해
@RestController
컨트롤러 내에서 -
통해
@RepositoryRestResource
리포지토리 내
내가 찾기 위해 고군분투하는 것은 왜 다른 하나를 사용하는 것입니다. 구현하려고 할 때 HAL
가장 좋은 것은 무엇입니까?
우리의 데이터베이스 백엔드는 Neo4j 입니다.
답변
좋습니다, 그래서 짧은 이야기는 Spring JPA@RepositoryRestResource
로 HATEOAS 서비스를 생성하기 때문에 사용하고 싶다는 것 입니다.
여기서 볼 수 있듯이이 주석을 추가하고 Pojo에 연결 하면 리포지토리 메서드 또는 REST 서비스 메서드를 구현할 필요없이 완전한 기능의 HATEOAS 서비스를 사용할 수 있습니다.
를 추가하면 @RestController
노출하려는 각 메서드를 직접 구현해야하며 HATEOAS 형식으로 내 보내지 않습니다 .
답변
설명하지 않은 세 번째 (및 네 번째) 옵션이 있는데, 엔티티 별 작업을 수행하는지 여부에 따라 @BasePathAwareController 또는 @RepositoryRestController를 사용하는 것입니다.
@RepositoryRestResource는 공용 리포지토리 인터페이스에서 옵션을 설정하는 데 사용됩니다. 확장되는 리포지토리 유형 (예 : CrudRepository / PagingAndSortingRepository / etc)에 따라 적절한 엔드 포인트를 자동으로 생성합니다.
@BasePathAwareController 및 @RepositoryRestController는 엔드 포인트를 수동으로 생성하고 싶지만 설정 한 SpringData REST 구성을 사용하고자 할 때 사용됩니다.
@RestController를 사용하는 경우, 다른 구성 옵션 (예 : 다른 메시지 변환기, 다른 오류 처리기 등) 을 사용하여 병렬 엔드 포인트 집합을 만들 수 있지만 행복하게 공존 할 수 있습니다 (혼란을 유발할 수 있음).
답변
글쎄, 위의 답변은 그들의 맥락에서 정확하지만 실용적인 예를 들었습니다.
API의 일부인 많은 시나리오에서 특정 기준에 따라 엔터티를 검색하기위한 엔드 포인트를 제공해야합니다. 이제 JPA를 사용하면 쿼리를 작성할 필요없이 Spring-JPA의 특정 명명법으로 인터페이스와 메서드를 만들면됩니다. 이러한 API를 노출하기 위해 단순히 이러한 리포지토리 메서드를 호출하는 서비스 계층을 만들고 마지막으로 서비스 계층을 호출하여 끝점을 노출하는 컨트롤러를 만듭니다.
여기서 Spring이 한 일은 일반적으로 검색 엔티티에 대한 GET 호출 인 인터페이스 (저장소)에서 이러한 엔드 포인트를 노출 할 수 있도록 허용하고 백그라운드에서 최종 엔드 포인트를 생성하는 데 필요한 파일을 생성합니다. 따라서 @RepositoryRestResource를 사용하는 경우 서비스 / 컨트롤러 계층을 만들 필요가 없습니다.
반면 @RestController는 특히 json 데이터를 처리하고 나머지는 컨트롤러로 작동하는 컨트롤러입니다. 간단히 말해서 @Controller + @ResponseBody = @RestController입니다.
도움이 되었기를 바랍니다.
내 작업 예제와 블로그를
참조
하십시오 .
http://sv-technical.blogspot.com/2015/11/spring-boot-and-repositoryrestresource.html
https://github.com/svermaji/Spring-boot-with -최대 절전 모드-컨트롤러 없음
답변
@RepositoryRestController
노출 된 저장소에서 기본 생성 된 SpringData REST 컨트롤러를 재정의합니다.
SpringData REST의 설정, 메시지 변환기, 예외 처리 등을 활용하려면
@RepositoryRestController
표준 Spring MVC 대신 주석을 사용@Controller
하거나@RestController
예를 들어이 컨트롤러 spring.data.rest.basePath
는 라우팅을위한 기본 경로로 Spring Boot 설정을 사용 합니다.
Spring 데이터 REST 응답 핸들러 재정의를 참조하십시오 .
@ResponseBody
누락 된 추가 주의@RepositoryRestController
저장소를 노출하지 않은 경우 (로 표시됨 @RepositoryRestResource(exported = false)
) @BasePathAwareController
대신 주석을 사용하십시오.
또한 가방에 유의하십시오
ControllerLinkBuilder
SpringData REST의 기본 경로를 고려 @RequestMapping
하지 않으며 클래스 / 유형 수준에서 사용해서는 안됩니다.
과
링크 수정을위한 해결 방법 : https://stackoverflow.com/a/51736503/548473
업데이트 : 마침내 @RepositoryRestController
많은 해결 방법으로 인해 사용하지 않는 것이 좋습니다 .