Requis Plusieurs beans de même type au printemps
Une demande avant que vous marquez comme en double. J'ai parcouru le forum et je ne pouvais pas trouver la solution pour le problème de n'importe où.
Je suis en train d'écrire un code à l'aide de Printemps 3.2 et tout ce qui est purement annotation de base. Le code reçoit des fichiers XML qui sont issus de différents fichiers XSD.
L'on peut dire, il y a cinq différents XSD ( A1, A2, A3, A4, A5) et mon code reçoit XML de tout type, et j'ai de la logique pour identifier le type de XML à l'arrivée.
Maintenant, je suis en train de l'onu-le maréchal à l'aide de Printemps OXM. Mais, car il y a plusieurs XSDs impliqués, nous ne pouvons pas réellement à l'aide de l'une des nations Unies-marshaller. Donc nous avons besoin d'environ cinq d'entre eux.
Dans le Configuration
classe, j'ai ajouté cinq haricots comme ci-dessous:
@Bean(name="A1Unmarshaller")
public Jaxb2Marshaller A1Unmarshaller(){
Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
unMarshaller.setContextPath("package name for the classes generate by XSD A1");
}
@Bean(name="A2Unmarshaller")
public Jaxb2Marshaller A1Unmarshaller(){
Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
unMarshaller.setContextPath("package name for the classes generate by XSD A2");
}
@Bean(name="A3Unmarshaller")
public Jaxb2Marshaller A3Unmarshaller(){
Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
unMarshaller.setContextPath("package name for the classes generate by XSD A3");
}
@Bean(name="A4Unmarshaller")
public Jaxb2Marshaller A4Unmarshaller(){
Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
unMarshaller.setContextPath("package name for the classes generate by XSD A4");
}
@Bean(name="A5Unmarshaller")
public Jaxb2Marshaller A5Unmarshaller(){
Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
unMarshaller.setContextPath("package name for the classes generate by XSD A5");
}
Maintenant, j'ai cinq différentes classes C1, C2, C3, C4 et C5 et je suis en train d'injecter un unmarshaller fève dans une classe. Cela signifie que A1Unmarshaller
est autocâblés à C1
et ainsi de suite.
Au Printemps lorsque le contexte est construit, il renvoie une erreur indiquant qu'il attend un bean de type Jaxb2Marshaller
et a obtenu cinq.
Note Il a bien fonctionné lors de la fait en utilisant la configuration XML, donc je ne sais pas si je suis absent quelque chose. S'il vous plaît aider.
MODIFIER Le code pour l'une des classes C1 est ci-dessous:
@Component
public class C1{
@Autowired
private Jaxb2Marshaller A1Unmarshaller;
A1 o = null
public boolean handles(String event, int eventId) {
if (null != event&& eventId == 5) {
A1 = A1Unmarshaller.unMarshal(event);
return true;
}
return false;
}
}
source d'informationauteur dharam | 2013-09-10
Vous devez vous connecter pour publier un commentaire.
Vous devriez qualifier votre autocâblés variable-à-dire dont l'une doit être injecté
La valeur par défaut permettra à l'autowiring est, par type, pas par nom, quand il y a plus d'un bean du même type, vous devez utiliser le @Qualifier d'annotation.
D'Injection à l'aide de
@Resource
annotation est ce que vous cherchez. Vous pouvez utiliserMais ce n'est pas la seule façon.
Fait le travail aussi. Je vous suggère d'utiliser le plus tard! Voir pourquoi
La
Jaxb2Marshaller
est parfaitement capable de travailler avec plusieurs différents contextes/xsd. Il suffit de spécifier un contexte plusieurs chemins à l'aide de la setContextPaths méthodes.De cette façon, vous avez besoin seulement d'un marshaller/unmarshaller.
Liens