Customizando pontos de extremidade HTTP no Spring Data REST
1. Introdução
O Spring Data REST pode remover muitos clichês naturais para os serviços REST.
Neste tutorial, vamos explorar comocustomize some of Spring Data REST’s HTTP binding defaults.
2. Fundamentos do Repositório Spring Data REST
Para começar, vamoscreate an empty interface that extends the CrudRepository interface, especificando o tipo de nossa entidade e o tipo de sua chave primária:
public interface UserRepository extends CrudRepository {}
Por padrão,Spring generates all the mappings needed configura cada recurso para ser acessível por meio dos métodos HTTP apropriados e retorna os códigos de status apropriados.
Se não precisarmos de todos os recursos definidos emCrudRepository, podemos estender a interface básicaRepository edefine only the resources we want:
public interface UserRepository extends Repository {
void deleteById(Long aLong);
}
Ao receber uma solicitação,Spring reads the HTTP Method used and, depending on the resource type, calls the appropriate method defined in our interface, se presente, ou retorna um status HTTP405 (Method Not Allowed) caso contrário.
Com referência ao código acima, quando o Spring recebe uma solicitação DELETE, ele executa nosso métododeleteById.
3. Restringindo quais métodos HTTP são expostos
Vamos imaginar que temos um sistema de gerenciamento de usuários. Podemos, então, ter umUserRepository.
E, como estamos usando Spring Data REST, ganhamos muito com ele extendendoCrudRepository:
@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends CrudRepository {}
All our resources are exposed using the default CRUD pattern, emitindo o seguinte comando:
curl -v -X DELETE http://localhost:8080/users/
retornará um status HTTP204 (No Content returned) para confirmar a exclusão.
Agora, vamos suporwe want to hide the delete method de terceiros ao mesmo tempo em que podemos usá-lo internamente.
Podemos então primeiro adicionar a assinatura do métododeleteById em nossa interface, o que sinaliza ao Spring Data REST que iremos configurá-lo.
Então, podemos usar a anotação@RestResource(exported = false), que seráconfigure Spring to skip this method when triggering the HTTP method exposure:
@Override
@RestResource(exported = false)
void deleteById(Long aLong);
Agora, se repetirmos o mesmo comandocUrl mostrado acima, receberemos um Status HTTP405 (Method Not Allowed).
4. Personalizando métodos HTTP suportados
A anotação@RestResource também nos dá a capacidade decustomize the URL path mapped to a repository methode o id do link no JSON retornado pela descoberta de recursosHATEOAS.
Para fazer isso, usamos os parâmetros opcionais da anotação:
-
path para o caminho do URL
-
rel para o id do link
Vamos voltar ao nossoUserRepositorye adicionar um métodofindByEmail simples:
WebsiteUser findByEmail(@Param("email") String email);
Ao executarcUrl ahttp://localhost:8080/users/search/, agora podemos ver nosso novo método listado com outros recursos:
{
"_links": {
"findByEmail": {
"href": "http://localhost:8080/users/search/findByEmail{?email}"
},
"self": {
"href": "http://localhost:8080/users/search/"
}
}
}
If we don’t like the default path, instead of changing the repository method, we can simply add the @RestResource annotation:
@RestResource(path = "byEmail", rel = "customFindMethod")
WebsiteUser findByEmail(@Param("email") String email);
E se fizermos a descoberta de recursos novamente, o JSON resultante confirmará nossas alterações:
{
"_links": {
"customFindMethod": {
"href": "http://localhost:8080/users/search/byEmail{?email}",
"templated": true
},
"self": {
"href": "http://localhost:8080/users/search/"
}
}
}
5. Configuração programática
Às vezes, precisamos de um nível de configuração mais refinado para expor ou restringir o acesso aos nossos métodos HTTP. Por exemplo, POST em recursos de coleção, bem como PUT e PATCH em recursos de item, todos usam o mesmo métodosave.
Starting from Spring Data REST 3.1, and available with Spring Boot 2.1,we can change the exposure of a specific HTTP method até a classeExposureConfiguration . Essa classe de configuração específica expõe uma API baseada em lambda para definir regras globais e baseadas em tipo.
Por exemplo, podemos usarExposureConfiguration to restringir solicitações PATCH contraUserRepository:
public class RestConfig implements RepositoryRestConfigurer {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration restConfig) {
ExposureConfiguration config = restConfig.getExposureConfiguration();
config.forDomainType(WebsiteUser.class).withItemExposure((metadata, httpMethods) ->
httpMethods.disable(HttpMethod.PATCH));
}
}
6. Conclusão
Neste artigo, exploramos como podemos configurar o Spring Data REST para personalizar os métodos HTTP suportados por padrão em nossos recursos.
Como de costume, os exemplos usados neste artigo podem ser encontrados em nossoGitHub project.