2016-04-20 9 views
3

Wie injizieren Repository in generische Klasse?NoUniqueBeanDefinitionException beim Injizieren von JpaRepository in die generische Klasse

public class FruitComboBox<T extends Fruit> extends ComboBox { 

    @Autowired 
    private JpaRepository<T, Integer> repository; 
    ... 
} 

public class FruitMarket { 

    @Autowired 
    FruitComboBox<Apple> appleCombobox; // Apple extends Fruit 

    @Autowired 
    FruitComboBox<Orange> orangeCombobox; // Orange extends Fruit 

    ... 
} 

Auch habe ich zwei Repositories

@Repository 
public interface AppleRepository extends JpaRepository<Apple, Integer> { 
} 

@Repository 
public interface OrangeRepository extends JpaRepository<Orange, Integer> { 
} 

Ich nehme an, dass die generische Repository von FruitComboBox aufgelöst werden sollte als eine von zwei vorhandenen Repositories nach ist es T und autowired von Frühling.

Die NoUniqueBeanDefinitionException: erwartete einzelne übereinstimmende Bean aber gefunden 2 tritt zur Laufzeit (nicht beim Start der Anwendung). Also nahm ich an, dass zur Laufzeit alle Typen definiert sind und Spring weiß, welcher konkrete Typ T ist.

+0

Irgendwelche Fortschritte dabei? Ich habe ein ähnliches Problem und für mich klingt es wie ein Käfer! – Robin

Antwort

0

Spring-Daten müssen zur Bootstrap-Zeit die Entität kennen, die das Repository darstellt. Das bedeutet, dass Sie es während des Autowiderlaufs nicht mit Generic Parameter verlassen können.

Erstellen Sie eine separate Schnittstelle wie unten.

Jetzt sollten Sie in der Lage sein, es mit einem bestimmten Typ (nicht generischen Typ) zu autowire. Dies ist so allgemein wie es nur geht.

@Autowired 
private MyGenericRepository<Apple, Integer> repository; 

Oben kann nicht mit generischen Parameter verlassen werden.

Referenz http://docs.spring.io/spring-data/jpa/docs/1.6.5.RELEASE/reference/html/repositories.html

auch versuchen Long für die IDs zu verwenden.

+0

Danke, aber ich untersuche die Möglichkeiten zum Autowiring des Repositories, das tatsächlich existiert. Ich habe eine genauere Definition gegeben, bitte sehen Sie sich die Frage an –