我可以将bean自动装入接口吗?

时间:2018-05-14 14:36:59

标签: java spring-boot mapstruct

我正在使用MapStruct并且为此我必须使用相应的映射函数定义接口。通过使用 default @BeforeMapping @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;
    }
}

1 个答案:

答案 0 :(得分:0)

您无法将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.
    }    
}