2016-08-06 22 views

Antwort

3

Es sollte möglich sein, wenn Sie Frühling als das Komponentenmodell erklären und einen Verweis auf die Art von myservice hinzufügen:

@Mapper(componentModel="spring", uses=MyService.class) 
public interface MyMapper { ... } 

Dieser Mechanismus für die Bereitstellung von Zugang zu anderen Abbildungsverfahren, was durch generierte Code aufgerufen werden , aber Sie sollten in der Lage sein, sie auch so zu benutzen. Stellen Sie nur sicher, dass Sie den richtigen Namen des generierten Felds mit der Service-Referenz verwenden.

+0

Ich habe das gleiche Problem und es scheint, dass die Klassen, die mit 'uses' deklariert sind, nur autowired werden, wenn eine ihrer Methoden als source-> target mapping verwendet wird. Wenn sie nur in einem Ausdruck verwendet werden * not * get autowired –

+2

Ah, das ist ein interessanter Punkt, wenn Sie * nur * es in einem Ausdruck verwenden wollen. Könnten Sie ein Problem in [unserem Tracker] (https://github.com/mapstruct/mapstruct/issues) öffnen? Vielen Dank! – Gunnar

4

Wie von Brettanomyces kommentiert, wird der Dienst nicht injiziert, wenn er nicht in anderen Zuordnungsoperationen als Ausdrücken verwendet wird.

Die einzige Art, wie ich zu dieser gefunden ist:

  • Trans meine Mapper-Schnittstelle in einer abstrakten Klasse
  • den Dienst in der abstrakten Klasse Injizieren
  • es so die „Umsetzung“ geschützt Stellen der abstrakte Klasse hat Zugriff

ich bin mit CDI, aber es sollte die samel mit Frühling sein:

@Mapper(
     unmappedTargetPolicy = org.mapstruct.ReportingPolicy.IGNORE, 
     componentModel = "spring", 
     uses = { 
      // My other mappers... 
     }) 
public abstract class MyMapper { 

    @Autowired 
    protected MyService myService; 

    @Mappings({ 
     @Mapping(target="x", expression="java(myservice.findById(obj.getId()))")") 
    }) 
    public abstract Dto myMappingMethod(obj); 

}