@RestController와 @RepositoryRestResource를 사용하는 경우


87

REST 와 함께 Spring을 사용하는 방법에 대한 다양한 예를 살펴 보았습니다 . 우리의 최종 목표는 Spring HATEOAS/HAL설정입니다.

Spring 내에서 REST 를 렌더링하는 두 가지 별개의 방법을 보았습니다.

  1. 통해 @RestController컨트롤러 내에서

  2. 통해 @RepositoryRestResource리포지토리 내

내가 찾기 위해 고군분투하는 것은 왜 다른 하나를 사용하는 것입니다. 구현하려고 할 때 HAL가장 좋은 것은 무엇입니까?

우리의 데이터베이스 백엔드는 Neo4j 입니다.

답변:


62

좋습니다, 그래서 짧은 이야기는 Spring JPA@RepositoryRestResourceHATEOAS 서비스를 생성하기 때문에 사용하고 싶다는 것 입니다.

여기서 볼 수 있듯이이 주석을 추가하고 Pojo에 연결 하면 리포지토리 메서드 또는 REST 서비스 메서드를 구현할 필요없이 완전한 기능의 HATEOAS 서비스를 사용할 수 있습니다.

를 추가하면 @RestController노출하려는 각 메서드를 직접 구현해야하며 HATEOAS 형식으로 내 보내지 않습니다 .


7
기본적으로 SpringData REST는 모든 최상위 공용 인터페이스 저장소를 내 보냅니다. 인터페이스를 내 보내지 않거나 끝점의 세부 정보를 변경하려면 @RepositoryRestResource 만 필요합니다.
gregturn

4
SpringData REST와 함께 RestController를 사용하면 SpringData REST가 제공하는 모든 것을 회피 할 것입니다. Spring 데이터 REST의 메시지 변환기 등을 사용하는 커스텀 Spring MVC 컨트롤러를 코딩하려면 BasePathAwareController를 살펴보세요.
gregturn 2015-07-08

나는 받아 들여진 대답이 맞다고 생각하지 않는다. @gregturn이 더 나은 대답을 가지고있다.
Mark

39

설명하지 않은 세 번째 (및 네 번째) 옵션이 있는데, 엔티티 별 작업을 수행하는지 여부에 따라 @BasePathAwareController 또는 @RepositoryRestController를 사용하는 것입니다.

@RepositoryRestResource는 공용 리포지토리 인터페이스에서 옵션을 설정하는 데 사용됩니다. 확장되는 리포지토리 유형 (예 : CrudRepository / PagingAndSortingRepository / etc)에 따라 적절한 엔드 포인트를 자동으로 생성합니다.

@BasePathAwareController 및 @RepositoryRestController는 엔드 포인트를 수동으로 생성하고 싶지만 설정 한 SpringData REST 구성을 사용하고자 할 때 사용됩니다.

@RestController를 사용하는 경우, 다른 구성 옵션 (예 : 다른 메시지 변환기, 다른 오류 처리기 등) 을 사용하여 병렬 엔드 포인트 집합을 만들 수 있지만 행복하게 공존 할 수 있습니다 (혼란을 유발할 수 있음).

특정 문서는 여기 에서 찾을 수 있습니다 .


6
나는 이것이 더 이상 사실이 아니라고 생각합니다. @RestController에서와 동일한 경로를 사용하는 경우 @RepositoryRestResource저장소 엔드 포인트가 생성되지 않습니다.
Hubert Grzeskowiak

19

글쎄, 위의 답변은 그들의 맥락에서 정확하지만 실용적인 예를 들었습니다.

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 -최대 절전 모드-컨트롤러 없음


사람들이 내 블로그를 방문하는 것을 볼 수 있습니다.이 솔루션이 작동하면 찬성 투표하십시오.
shaILU

10

@RepositoryRestController 노출 된 저장소에서 기본 생성 된 SpringData REST 컨트롤러를 재정의합니다.

SpringData REST의 설정, 메시지 변환기, 예외 처리 등을 활용하려면 @RepositoryRestController표준 Spring MVC 대신 주석을 사용 @Controller하거나@RestController

예를 들어이 컨트롤러 spring.data.rest.basePath는 라우팅을위한 기본 경로로 Spring Boot 설정을 사용 합니다.

Spring 데이터 REST 응답 핸들러 재정의를 참조하십시오 .

@ResponseBody누락 된 추가 주의@RepositoryRestController

저장소를 노출하지 않은 경우 (로 표시됨 @RepositoryRestResource(exported = false)) @BasePathAwareController대신 주석을 사용하십시오.

또한 가방에 유의하십시오

ControllerLinkBuilderSpringData REST의 기본 경로를 고려 @RequestMapping하지 않으며 클래스 / 유형 수준에서 사용해서는 안됩니다.

기본 경로가 HAL에 표시되지 않습니다.

링크 수정을위한 해결 방법 : https://stackoverflow.com/a/51736503/548473

업데이트 : 마침내 @RepositoryRestController많은 해결 방법으로 인해 사용하지 않는 것이 좋습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.