Tenho visto vários exemplos de como usar o Spring com REST . Nosso objetivo final é uma HATEOAS/HAL
configuração de Spring
Eu vi dois métodos distintos para renderizar REST no Spring
Por meio de
@RestController
um controladorPor meio de
@RepositoryRestResource
um Repositório
O que estou lutando para descobrir é por que você usaria um em vez do outro. Ao tentar implementar o HAL
que é melhor?
Nosso backend de banco de dados é Neo4j .
Há uma terceira (e quarta) opção que você não descreveu, que é usar @BasePathAwareController ou @RepositoryRestController, dependendo se você está executando ações específicas da entidade ou não.
@RepositoryRestResource é usado para definir opções na interface pública do Repositório - ele criará pontos de extremidade automaticamente conforme apropriado com base no tipo de Repositório que está sendo estendido (ou seja, CrudRepository / PagingAndSortingRepository / etc).
@BasePathAwareController e @RepositoryRestController são usados quando você deseja criar pontos de extremidade manualmente, mas deseja usar as configurações REST do Spring Data que você definiu.
Se você usar @RestController, você criará um conjunto paralelo de endpoints com diferentes opções de configuração - isto é, um conversor de mensagem diferente, diferentes manipuladores de erro, etc. - mas eles coexistirão alegremente (e provavelmente causarão confusão).
A documentação específica pode ser encontrada aqui .
fonte
@RestController
usar o mesmo caminho que a@RepositoryRestResource
, os pontos de extremidade do repositório não serão criados.Bem, as respostas acima estão corretas em seu contexto, mas estou dando um exemplo prático.
Em muitos cenários, como parte da API, precisamos fornecer pontos de extremidade para pesquisar uma entidade com base em determinados critérios. Agora usando JPA você não precisa nem mesmo escrever queries, basta fazer uma interface e métodos com nomenclatura específica de Spring-JPA. Para expor essas APIs, você criará a camada de serviço, que simplesmente chamaria esses métodos de repositório e, finalmente, os controladores que exporão os pontos de extremidade chamando a camada de serviço.
O que o Spring fez aqui, permite que você exponha esses endpoints de tais interfaces (repositórios) que geralmente são chamadas GET para pesquisar entidade e em segundo plano gera os arquivos necessários para criar endpoints finais. Portanto, se você estiver usando @RepositoryRestResource, não há necessidade de criar a camada de Serviço / Controlador.
Por outro lado, @RestController é um controlador que lida especificamente com dados json e o resto do trabalho como controlador. Resumindo @Controller + @ResponseBody = @RestController.
Espero que isto ajude.
Veja meu exemplo de trabalho e blog para o mesmo:
http://sv-technical.blogspot.com/2015/11/spring-boot-and-repositoryrestresource.html
https://github.com/svermaji/Spring-boot-with -hibernate-no-controller
fonte
@RepositoryRestController
sobrescrever controladores Spring Data REST padrão gerados a partir do repositório exposto.Por exemplo, esses controladores usam a
spring.data.rest.basePath
configuração Spring Boot como caminho base para o roteamento.Consulte Substituindo Manipuladores de Resposta REST do Spring Data .
Esteja ciente de adicionar
@ResponseBody
, pois está faltando@RepositoryRestController
Se você não expôs o repositório (marcado como
@RepositoryRestResource(exported = false)
), use a@BasePathAwareController
anotação em seu lugarTambém esteja ciente de bolsas
ControllerLinkBuilder
não leva o caminho base do Spring Data REST em consideração e@RequestMapping
não deve ser usado em nível de classe / tipoe
O caminho de base não aparece no HAL
Solução alternativa para corrigir o link: https://stackoverflow.com/a/51736503/548473
ATUALIZAÇÃO: finalmente prefiro não usar
@RepositoryRestController
devido a muitas soluções alternativas.fonte