Anpassen von HTTP-Endpunkten in Spring Data REST

Anpassen von HTTP-Endpunkten in Spring Data REST

1. Einführung

Spring Data REST kann viele für REST-Services natürliche Boilerplates entfernen.

In diesem Tutorial erfahren Sie, wie Siecustomize some of Spring Data REST’s HTTP binding defaults erreichen.

2. Grundlagen des REST-Repository für Spring-Daten

Lassen Sie uns zunächstcreate an empty interface that extends the CrudRepository interface eingeben und den Typ unserer Entität und den Typ ihres Primärschlüssels angeben:

public interface UserRepository extends CrudRepository {}

Standardmäßig konfiguriertSpring generates all the mappings needed jede Ressource so, dass über die entsprechenden HTTP-Methoden auf sie zugegriffen werden kann, und gibt die richtigen Statuscodes zurück.

Wenn wir nicht alle inCrudRepository definierten Ressourcen benötigen, können wir die Basisschnittstelle vonRepository unddefine only the resources we want erweitern:

public interface UserRepository extends Repository {
  void deleteById(Long aLong);
}

Bei Empfang einer Anforderung wirdSpring reads the HTTP Method used and, depending on the resource type, calls the appropriate method defined in our interface, falls vorhanden, oder andernfalls ein HTTP-Status405 (Method Not Allowed) zurückgegeben.

Wenn Spring unter Bezugnahme auf den obigen Code eine DELETE-Anforderung empfängt, führt es diedeleteById-Methode aus.

3. Einschränken, welche HTTP-Methoden verfügbar gemacht werden

Stellen wir uns vor, wir haben ein Benutzerverwaltungssystem. Wir könnten dann einUserRepository. haben

Und da wir Spring Data REST verwenden, erhalten wir viel davon, wenn esCrudRepository verlängert:

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends CrudRepository {}

All our resources are exposed using the default CRUD pattern, also den folgenden Befehl ausgeben:

curl -v -X DELETE http://localhost:8080/users/

gibt einen HTTP-Status204 (No Content returned) zurück, um das Löschen zu bestätigen.

Nehmen wir nun an, dasswe want to hide the delete methodvon Dritten stammen, während wir es intern verwenden können.

Anschließend können wir zuerst die MethodensignaturdeleteByIdin unsere Schnittstelle einfügen, die Spring Data REST signalisiert, dass wir sie konfigurieren werden.

Dann können wir die Annotation@RestResource(exported = false) verwenden, dieconfigure Spring to skip this method when triggering the HTTP method exposure ergibt:

@Override
@RestResource(exported = false)
void deleteById(Long aLong);

Wenn wir nun den oben gezeigten BefehlcUrl wiederholen, erhalten wir stattdessen den HTTP-Status405 (Method Not Allowed).

4. Anpassen der unterstützten HTTP-Methoden

Die Annotation@RestResource gibt uns auch die Möglichkeit,customize the URL path mapped to a repository method und die Link-ID im JSON anzugeben, die von der Ressourcenerkennung vonHATEOASzurückgegeben werden.

Dazu verwenden wir die optionalen Parameter der Annotation:

  • path für den URL-Pfad

  • rel für die Link-ID

Kehren wir zu unserenUserRepository zurück und fügen eine einfachefindByEmail-Methode hinzu:

WebsiteUser findByEmail(@Param("email") String email);

Durch Ausführen voncUrl bishttp://localhost:8080/users/search/ können wir nun unsere neue Methode mit anderen Ressourcen aufgelistet sehen:

{
  "_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);

Und wenn wir die Ressourcenerkennung erneut durchführen, bestätigt der resultierende JSON unsere Änderungen:

{
  "_links": {
    "customFindMethod": {
      "href": "http://localhost:8080/users/search/byEmail{?email}",
      "templated": true
    },
    "self": {
      "href": "http://localhost:8080/users/search/"
    }
  }
}

5. Programmatische Konfiguration

Manchmal benötigen wir eine feinere Konfigurationsebene, um den Zugriff auf unsere HTTP-Methoden offen zu legen oder einzuschränken. Beispielsweise verwenden POST für Sammlungsressourcen sowie PUT und PATCH für Elementressourcen dieselbesave-Methode.

Starting from Spring Data REST 3.1, and available with Spring Boot 2.1,we can change the exposure of a specific HTTP method durch dieExposureConfiguration -Klasse. Diese spezielle Konfigurationsklasse macht eine Lambda-basierte API verfügbar, um sowohl globale als auch typbasierte Regeln zu definieren.

Zum Beispiel können wirExposureConfiguration verwenden, um PATCH-Anforderungen aufUserRepository zu beschränken:

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. Fazit

In diesem Artikel haben wir untersucht, wie Spring Data REST so konfiguriert werden kann, dass die in unseren Ressourcen standardmäßig unterstützten HTTP-Methoden angepasst werden.

Die in diesem Artikel verwendeten Beispiele finden Sie wie üblich in unserenGitHub project.