[英]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.