我正在使用
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;
}
}
您无法将 bean 自动装配到接口中。但是,您可以使用 MapStruct 1.2.0 中的
@Context
。
例如:
@Mapper
public interface MyMapper {
Target map(Source source, @Context MyCustomService service);
@AfterMapping
default void after(Source source, @MappingTarget Target target, @Context MyCustomService service) {
// Your logic
}
}
另一种选择是使用抽象类而不是接口。
@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.
}
}