Verständnis der @NoRepositoryBean-Schnittstelle von Spring Data JPA

Lesezeit: 2 Minuten

Benutzer-Avatar
balteo

Ich bin auf die gestoßen @NoRepositoryBean Schnittstelle mehrmals, während Sie die Spring Data-Dokumentation lesen.

Um aus der Dokumentation zu zitieren:

Wenn Sie die automatische Repository-Schnittstellenerkennung mit dem Spring-Namespace verwenden und die Schnittstelle unverändert verwenden, versucht Spring, eine Instanz von MyRepository zu erstellen. Dies ist natürlich nicht erwünscht, da es nur als Vermittler zwischen dem Repository und den eigentlichen Repository-Schnittstellen fungiert, die Sie für jede Entität definieren möchten. Um eine Schnittstelle, die das Repository erweitert, von der Instanziierung als Repository-Instanz auszuschließen, kommentieren Sie sie mit @NoRepositoryBean.

Allerdings bin ich mir immer noch nicht sicher, wann und wo ich es verwenden soll. Kann mir bitte jemand einen Rat geben und mir ein konkretes Anwendungsbeispiel geben?

Benutzer-Avatar
Oliver Drotbohm

Die Anmerkung wird verwendet, um zu vermeiden, dass Repository-Proxys für Schnittstellen erstellt werden, die tatsächlich den Kriterien einer Repo-Schnittstelle entsprechen, aber keines sein sollen. Es ist nur erforderlich, wenn Sie beginnen, alle Repositories mit Funktionalität zu erweitern. Lassen Sie mich Ihnen ein Beispiel geben:

Angenommen, Sie möchten allen Ihren Repositories eine Methode foo() hinzufügen. Sie würden damit beginnen, eine Repo-Schnittstelle wie diese hinzuzufügen

public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> {

  void foo();
}

Sie würden auch die entsprechende Implementierungsklasse, Fabrik usw. hinzufügen. Ihre konkreten Repository-Schnittstellen würden nun diese Zwischenschnittstelle erweitern:

public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> {

}

Nehmen wir nun an, Sie booten – sagen wir Spring Data JPA – wie folgt:

<jpa:repositories base-package="com.foobar" />

Sie nutzen com.foobar weil du hast CustomerRepository im selben Paket. Die Spring Data-Infrastruktur hat jetzt keine Möglichkeit, dies zu sagen MyBaseRepository ist keine konkrete Repository-Schnittstelle, sondern fungiert eher als Zwischen-Repository, um die zusätzliche Methode bereitzustellen. Es würde also versuchen, eine Repository-Proxy-Instanz dafür zu erstellen, und fehlschlagen. Sie können jetzt verwenden @NoRepositoryBean um diese Zwischenschnittstelle zu kommentieren, um Spring Data im Wesentlichen mitzuteilen: Erstellen Sie keine Repository-Proxy-Bean für diese Schnittstelle.

Dieses Szenario ist auch der Grund dafür CrudRepository und PagingAndSortingRepository auch diesen Vermerk tragen. Wenn das Scannen des Pakets diese versehentlich erfasst hat (weil Sie es versehentlich so konfiguriert haben), würde der Bootstrap fehlschlagen.

Um es kurz zu machen: Verwenden Sie die Annotation, um zu verhindern, dass Repository-Schnittstellen als Kandidaten aufgegriffen werden, um schließlich als Repository-Bean-Instanzen zu enden.

Wir können eine neue Schnittstelle als unsere benutzerdefinierte Methode deklarieren:

@NoRepositoryBean
public interface ExtendedRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    List<T> findByAttributeContainsText(String attributeName, String text);
}

Unsere Schnittstelle erweitert die JpaRepository-Schnittstelle, sodass wir von allen Standardverhalten profitieren.

Sie werden auch feststellen, dass wir die Annotation @NoRepositoryBean hinzugefügt haben. Dies ist erforderlich, da ansonsten das Standardverhalten von Spring darin besteht, eine Implementierung für alle Unterschnittstellen des Repositorys zu erstellen.

public interface ExtendedStudentRepository extends ExtendedRepository<Student, Long> {
}

1229480cookie-checkVerständnis der @NoRepositoryBean-Schnittstelle von Spring Data JPA

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy