2017-02-20 1 views
1

Angenommen, ich habe eine Entität namens Product. Ich entwerfe ein Repo alsHinzufügen von benutzerdefinierten Methode zu JPAR Repository mit Generics

@Repository 
interface ProductRepository implements JPARepository<Product, Integer>{} 

Diese alle Standardmethoden erben würde wie save, findAll etc;

Jetzt möchte ich eine benutzerdefinierte Methode, die auch eine gemeinsame Methode für andere Entitäten ist. Ich habe eine andere Schnittstelle und Implementierung

interface CustomRepository<T,ID>{ public void customMethod() } 
class CustomRepositoryImpl implements CustomRepository<T,ID>{ public void customMethod(){} } 

Und ich schreiben die ProductRepository als

@Repository 
interface ProductRepository implements 
JPARepository<Product, Integer>, 
CustomRepository<Product, Integer> 
{} 

Nun, das mir keine Übersetzungsfehler nicht geben. Aber zur Laufzeit bekomme ich diesen Fehler:

No property 'customMethod' is found for Product

Was fehlt mir?

Antwort

3

Sie scheinen zu versuchen, benutzerdefiniertes Verhalten zu einem einzigen Repository hinzufügen, nämlich ProductRepository. Der Code ist jedoch so strukturiert, als ob benutzerdefiniertes Verhalten allen Repositorys hinzugefügt werden muss (CustomRepository ist nicht spezifisch für Product s). Daher der Fehler.


Step 1: Declare a custom repository

interface CustomRepository<T, ID extends Serializable> { 
    void customMethod(); 
} 

Step 2: Add custom behaviour to the required repository

interface ProductRepository extends CrudRepository<Product, Integer> 
            , CustomRepository<Product, Integer> {} 

Step 3: Add a Product specific implementation

class ProductRepositoryImpl implements CustomRepository<Product, Integer> { ... } 

Hinweis: Die Klasse muss ProductRepositoryImpl für Spring Data JPA Sanitär es aufzuheben automatisch benannt werden.


Ein funktionierendes Beispiel ist verfügbar on Github.


Wenn Sie lieber individuelle Verhalten auf allen Repositories hinzufügen, beziehen sich auf die relevant section in der offiziellen Dokumentation.

+0

Danke für den Code-Link. Für was ist die Klasse 'Model'? Was ist die Definition der Klasse? Außerdem sollte ProductrepositoryImpl das ProductRepository implementieren, ansonsten wird spring keine Instanz erstellen. – madhairsilence

+0

Der gesamte Code ist im Beispiel enthalten.Führen Sie Integrationstests als 'mvn test' durch. – manish

+0

Ok. Model @MappedSuperClass ist neu hier. Aber wieder. Ich konnte sehen, dass customMethod in ProductRepositoryImpl implementiert wird. Dies würde es nur für das Produkt verfügbar machen. Wenn ich eine neue Entität namens Service habe. Ich müsste wieder denselben Code "Dito" schreiben. Wie verschiebe ich die Implementierung in die generische Klasse – madhairsilence

0

Ok. Dies ist für Leute, die versuchen, diese Arbeit in einer SpringBoot-Anwendung zu bekommen

folgen, was auch immer von @manish gepostet. Arbeitscode hier Working Code

Sie müssen nur eine kleine Änderung vornehmen. definieren Modellklasse als

@MappedSuperclass 
@IdClass(ModelID.class) 
public abstract class Model implements Serializable 

die ID-Klasse definieren als

public class ModelID implements Serializable{ 

    @Column(name = "id") 
    @Generated(GenerationTime.INSERT) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Id 

    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 



} 

Das hat funktioniert mich!

Verwandte Themen