Mapstruct - Comment puis-je injecter un printemps de la dépendance dans le Générés Mappeur de classe
J'ai besoin d'injecter un printemps classe de service dans le générés mappeur de mise en œuvre, afin que je puisse l'utiliser via
@Mapping(target="x", expression="java(myservice.findById(id))")"
Est-ce applicable dans Mapstruct-1.0?
OriginalL'auteur Karim Tawfik | 2016-08-06
Vous devez vous connecter pour publier un commentaire.
Il devrait être possible si vous déclarez Ressort que le modèle de composant et d'ajouter une référence au type de
myservice
:Ce mécanisme est destiné à fournir un accès à d'autres méthodes de cartographie d'être appelé par le code généré, mais vous devriez être capable de les utiliser dans l'expression de cette façon, aussi. Juste assurez-vous d'utiliser le nom correct du champ généré avec le service de référence.
Ah, c'est intéressant si vous vous voulez l'utiliser dans une expression. Pourriez-vous ouvrir un problème dans notre tracker? Merci!
OriginalL'auteur Gunnar
Comme commenté par brettanomyces, le service ne sera pas injecté si elle n'est pas utilisée dans la cartographie des opérations autres que des expressions.
Le seul moyen que j'ai trouvé c'est :
Je suis en CDI mais elle devrait être la samel avec le Printemps :
OriginalL'auteur Bob
Depuis la version 1.2 ce problème peut être résolu avec une combinaison de @AfterMapping et @Contexte.. Comme ceci:
Le service peut être transmis en tant que contexte.
Une meilleure solution serait d'utiliser un
@Context
classe qui encapsuleMyService
au lieu de passerMyService
directement. Un@AfterMapping
méthode peut être mis en œuvre sur ce "contexte" de la classe:void map( @MappingTarget Target.X target, Source.ID source )
en gardant la logique de mapping claire de la logique de recherche. Checkout cet exemple dans le MapStruct exemple de référentiel.pourriez-vous vérifier si vous pouvez transmettre le constructeur
@MappingTarget
?c'est une excellente suggestion. Je l'ai essayé et il fonctionne comme un charme. Le
map()
est appelé avant que les constructeursbuild()
méthode.OriginalL'auteur Sjaak
Ce qui vaut la peine d'ajouter en plus des réponses ci-dessus est qu'il n'y est plus propre façon d'utiliser le printemps de service dans mapstruct mappeur, qui s'inscrit plus dans le "la séparation des préoccupations" design concept, appelé "qualifier".
Pour plus de simplicité, je préfère nommé qualifier comme indiqué ici http://mapstruct.org/documentation/stable/reference/html/#selection-based-on-qualifiers
Exemple serait:
C'est la façon dont vous l'utilisez dans votre mapper:
OriginalL'auteur Cmyker