簡體   English   中英

我可以將 Spring bean 自動裝配到 MapStruct 接口中嗎?

[英]Can I autowire a Spring bean into a MapStruct interface?

我正在使用MapStruct ,為此我必須定義一個具有相應映射函數的接口。 可以通過使用@BeforeMapping注釋的default方法來實現一些邏輯 @AfterMapping 在這樣一個帶注釋的默認方法中,我想使用我的 SpringBoot 應用程序的配置類。 我怎樣才能做到這一點? 我可以將這樣的配置(bean)自動裝配到接口中嗎? 這樣的代碼應該是什么樣子的?


從文檔和您的提示中,我發現我可以使用 @Context 變量或抽象類而不是使用接口。

我當時都試了。 使用抽象類它可以按要求運行良好,但使用 @Context 變量不會調用默認方法。

這是主要的映射方法:

@Mapping(target = "myTarget.partNumber", ignore = true)
public MyTarget mapSource2Target(final MySource mySource, final PartNumberMapConfiguration partNumberMapConfiguration);

afterMapping方法:

@AfterMapping
default void afterMapping(final @MappingTarget MyTarget target, final MySource source, final @Context PartNumberMapConfiguration partNumberMapConfiguration) {. . . }

當我到達調用映射器的斷點時,我無法進入映射方法。 它只是跳過......並且沒有執行afterMapping方法的代碼。

這是我打算與@Context 一起使用的類:

@Component("PartNumberMap")
@PropertySource("classpath:abc.properties")
@ConfigurationProperties(prefix = "abc")
public class PartNumberMapConfiguration {
    
    private Map<String, String> partNumberMap = new HashMap<String, String>();
    
    public Map<String, String> getPartNumberMap() {
        return partNumberMap;
    }
    
    public void setPartNumberMap(final Map<String, String> partNumberMap) {
        this.partNumberMap = partNumberMap;
    }
}

您不能將 bean 自動裝配到接口中。 但是,您可以使用 MapStruct 1.2.0 中的@Context

例如:

@Mapper
public interface MyMapper {


    Target map(Source source, @Context MyCustomService service);

    @AfterMapper
    void after(Source source, @MappingTarget Target target, @Context MyCustomService service) {
        // Do what you need here
    }
}

另一種選擇是使用抽象類而不是接口。

@Mapper
public abstract class MyMapper {

    private MyCustomService service;


    public abstract Target map(Source source);


    @AfterMapping
    protected after(Source source, @MappingTarget Target target) {
        // Use the service here
    }

    @Autowired
    public void setService(MyCustomService service) {
        this.service = service.
    }    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM