printemps permettra à l'autowiring unique avec des haricots: Printemps unique correspondant bean, mais à 2
Je suis en train de autowire quelques haricots (pour l'injection de dépendances) à l'aide de Printemps pour une webapp. Un contrôleur de haricots contient un autre bean qui détient une table de hachage d'un autre ensemble de grains. Pour l'instant, la carte dispose d'une seule entrée. Quand je lance tomcat et appeler le service que je reçois un message d'erreur indiquant que le deuxième haricot (tenue dans le contrôleur) n'est pas unique
No unique bean of type [com.hp.it.km.search.web.suggestion.SuggestionService] is defined: expected single matching bean but found 2: [suggestionService, SuggestionService]
Je ne vois pas où je suis, la définition du bean deux fois cependant je suis nouveau sur le Printemps et permettra à l'autowiring alors, j'ai peut être raté quelque chose de fondamental. Code Source xml et 2 classe énumérés ci-dessous...
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.hp.it.km.search.web.suggestion" />
<mvc:annotation-driven />
<context:annotation-config />
<bean id="SuggestionController" class="com.hp.it.km.search.web.suggestion.SuggestionController">
<property name="service">
<ref bean="SuggestionService" />
</property>
</bean>
<bean id="SuggestionService" class="com.hp.it.km.search.web.suggestion.SuggestionService">
<property name="indexSearchers">
<map>
<entry key="KMSearcher"> <ref bean="KMSearcherBean"></ref></entry>
</map>
</property>
</bean>
<bean id="KMSearcherBean" class="com.hp.it.km.search.web.suggestion.SuggestionIndexSearcher">
<constructor-arg index="0" value="KMSearcher" />
<constructor-arg index="1" value="C://dev//workspace//search-restful-webapp//src//main//resources//indexes//keyword" />
</bean>
La classe asscoaites avec le autocâblés contrôleur et le service de haricots sont ici...
@Controller
public class SuggestionController {
private SuggestionService service;
@Autowired
public void setService(SuggestionService service) {
this.service = service;
}
public SuggestionService getService() {
return service;
}
et...
@Component
public class SuggestionService {
private Map<String, IndexSearcher> indexSearchers = new HashMap<String, IndexSearcher>();
@Autowired
public void setIndexSearchers(Map<String, IndexSearcher> indexSearchers) {
this.indexSearchers = indexSearchers;
}
public SuggestionService() {
super(); }
S'Il Vous Plaît Aider!
Vous devez vous connecter pour publier un commentaire.
La question est parce que vous avez un bean de type SuggestionService créé par @Composant d'annotation et également par le biais de la configuration XML . Comme expliqué par JB Nizet, cela aboutira à la création d'un bean avec le nom "suggestionService" créé via @Composant et un autre avec le nom "SuggestionService' créé par XML .
Lorsque vous vous référez à SuggestionService par @Autocâblés, dans votre contrôleur, le Printemps autowires "type" par défaut et trouver à deux grains de type 'SuggestionService'
Vous pouvez effectuer les opérations suivantes
Utiliser @Ressource au lieu de @Autocâblés de choisir le haricot par son nom .
ou
les deux doivent travailler.Le troisième est un sale résoudre, et qu'il est préférable de résoudre le haricot conflit par d'autres moyens.
Si vous avez 2 grains de la même classe autocâblés à une classe, vous devriez utiliser
@Qualifier
(Printemps permettra à l'autowiring @Qualifier exemple).Mais il semble que votre problème vient d'une mauvaise Syntaxe Java.
Votre objet doit commencer par une lettre minuscule
Votre setter devrait commencer avec des minuscules ainsi et nom de l'objet doit être avec des majuscules
Si je ne me trompe pas, la valeur par défaut de haricots nom de bean déclaré avec @Composant est le nom de sa classe sa première lettre en minuscule. Cela signifie que
déclare un bean de type
SuggestionService
, et de nomsuggestionService
. C'est l'équivalent deou à
Vous êtes à la redéfinition d'un autre bean du même type, mais avec un nom différent, dans le XML:
Donc, soit spécifier le nom de la fève dans l'annotation à
SuggestionService
, ou utiliser l'IDsuggestionService
dans le XML (ne pas oublier de modifier le<ref>
élément, ou de le supprimer, car il n'est pas nécessaire). Dans ce cas, la définition XML va se substituer à l'annotation définition.Pour moi, c'était d'avoir deux grains de mise en œuvre de la même interface. L'un était un faux, l'interdiction pour le bien de l'unité de test qui était en conflit avec haricot original.
Si nous utilisons
il fait toujours référence à suggestionService.
J'ai donc enlevé @composant et seulement utilisé
qui a résolu le problème