Le printemps 3 DI de l'utilisation de générique interface DAO
Je suis en train d'utiliser @Autocâblés annotation avec mon générique Dao interface comme ceci:
public interface DaoContainer<E extends DomainObject> {
public int numberOfItems();
//Other methods omitted for brevity
}
- Je utiliser cette interface dans mon Contrôleur en suivant la mode:
@Configurable
public class HelloWorld {
@Autowired
private DaoContainer<Notification> notificationContainer;
@Autowired
private DaoContainer<User> userContainer;
//Implementation omitted for brevity
}
J'ai configuré mon contexte de l'application avec la configuration suivante
<context:spring-configured />
<context:component-scan base-package="com.organization.sample">
<context:exclude-filter expression="org.springframework.stereotype.Controller"
type="annotation" />
</context:component-scan>
<tx:annotation-driven />
Cela ne fonctionne que partiellement, depuis le Printemps crée et injecte une seule instance de mon DaoContainer, à savoir DaoContainer. En d'autres termes, si je demande à userContainer.numberOfItems(); j'obtiens le nombre de notificationContainer.numberOfItems()
J'ai essayé d'utiliser fortement typé interfaces pour marquer la mise en œuvre correcte comme ceci:
public interface NotificationContainer extends DaoContainer<Notification> { }
public interface UserContainer extends DaoContainer<User> { }
Et ensuite utilisé ces interfaces comme ceci:
@Configurable
public class HelloWorld {
@Autowired
private NotificationContainer notificationContainer;
@Autowired
private UserContainer userContainer;
//Implementation omitted...
}
Malheureusement, ce ne BeanCreationException:
org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.organization.sample.dao.NotificationContainer com.organization.sample.HelloWorld.notificationContainer; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.organization.sample.NotificationContainer] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Maintenant, je suis un peu confus comment dois-je procéder ou à l'aide de plusieurs Dao est encore possible. Toute aide serait grandement appréciée 🙂
- Je ne vois pas la mise en œuvre des classes pour vos interfaces. Combien sont-ils et que font-ils ressembler?
- Je n'avais pas explicite des implémentations pour les interfaces, car j'espérais que je pourrais utiliser générique de la classe dao (c'est à dire DaoContainer<E s'étend DomainObject>). J'ai pu créer explicite implémentations (comme Espen a souligné dans sa réponse). Qui ne semble pas raisonnable, étant donné que je suis en train de prendre avantage de Java génériques autant que possible. Cependant, j'ai DaoContainerImpl<E s'étend DomainObject>.
- peut-être que stackoverflow.com/questions/502994/... c'est une solution
Vous devez vous connecter pour publier un commentaire.
Ok, je crois que j'ai trouvé assez raisonnable, la solution de cette énigme. Une façon de traiter ce serait de la création de l'interface et de l'implémentation de chaque entité dans mon modèle de domaine (comme Espen a souligné dans sa réponse précédente). Maintenant, envisager d'avoir des centaines d'entités et, respectivement, des centaines de mises en œuvre. Qui ne se sent pas le droit, non?
J'ai jeté fortement typé sous-interfaces et j'utilise l'interface générique à la place:
Mise en œuvre pour mon DaoContainer interface ressemblerait à quelque chose comme ceci:
Et, enfin, le contexte de l'application:
Donc, fondamentalement, je ne pouvais pas obtenir pur générique permettra à l'autowiring de travail, mais cette solution fonctionne pour moi (au moins pour l'instant) 🙂
Il est possible de autowire autant de fèves que vous le souhaitez.
Mais quand vous êtes à l'aide permettra à l'autowiring par type, il peut être un seul de la fève de chaque interface. Votre message d'erreur dit: vous n'en avez aucun bean disponible au Printemps contenant de l'interface donnée.
Une solution:
La disparition de votre DAO implémentations:
Votre classe de service:
J'ai remplacé le
@Configurable
annotation avec@Service
.@Configurable
est utilisé conjointement avec AspectJ et n'est pas ce que vous voulez ici. Vous devez utiliser@Component
ou une spécialisation comme@Service
.Souviens aussi d'avoir tous vos Printemps composants à l'intérieur de votre
com.organization.sample
paquet pour activer le Printemps conteneur pour les trouver.J'espère que cela aide!