java - 我可以将 Spring bean Autowiring 到 MapStruct 接口(interface)中吗?

标签 java spring-boot mapstruct

我正在使用MapStruct,为此我必须定义一个具有相应映射函数的接口(interface)。可以使用使用 @BeforeMapping @AfterMapping 注释的 default 方法来实现某些逻辑。在这样一个带注释的默认方法中,我想使用 SpringBoot 应用程序的配置类。我怎样才能做到这一点?我可以将这样的配置(bean) Autowiring 到接口(interface)中吗?这样的代码应该是什么样的?

<小时/>

从文档和您的提示中,我发现我可以使用 @Context 变量或抽象类,而不是使用接口(interface)。

当时我都尝试了。使用抽象类,它可以很好地满足要求,但使用 @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 Autowiring 到接口(interface)中。但是,您可以使用 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
    }
}

另一种选择是使用抽象类而不是接口(interface)。

@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.
    }    
}

关于java - 我可以将 Spring bean Autowiring 到 MapStruct 接口(interface)中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50332969/

相关文章:

java - JPA 存储库 findById 被 $$_hibernate_interceptor 拦截

java - 带有嵌套映射器和 unmappedSourcePolicy 的 Mapstruct Bug

java - 如何使用 Mapstruct 和 Kotlin 在另一个映射器中使用一个映射器?

JavaFX 警报边框

java - 无法获得正确的输出 xml 文件

java - 无法访问 Play-1.2 View 模板内的 HashMap

java - Docker容器无法将日志发送到docker ELK堆栈

java - :link in JSF gets called automatically

java - 如何使用相同的方法和不同的 header 来简化 REST Controller ?

java - 在Eclipse中,是否可以默认设置注释处理和工厂路径?