不从@Mapper接口调用@AfterMapping

时间:2019-11-25 09:36:28

标签: java mapstruct

我在使用Mapstruct时遇到问题。

我在内部使用@Mapper的{​​{1}}批注界面,如下所示:

@AfterMapping

映射器可以完美地工作,但是从未调用@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface ConfiguracionReautorizacionMapper { ConfiguracionReautorizacionDTO toConfiguracionReautorizacionDTO(final ConfiguracionReautorizacion configuracionReautorizacion); ConfiguracionReautorizacion toConfiguracionReautorizacion(final ConfiguracionReautorizacionDTO configuracionReautorizacionDTO); @AfterMapping default void fillServiciosAsociados(@MappingTarget final ConfiguracionReautorizacionDTO configuracionReautorizacionDTO, final ConfiguracionReautorizacion configuracionReautorizacion) { configuracionReautorizacionDTO.setTieneRolesOServiciosAsociados(!(CollectionUtils.isEmpty(configuracionReautorizacion.getRolesAplicacionEdesk()) && CollectionUtils.isEmpty(configuracionReautorizacion.getRolesAplicacionEdesk()))); } } 方法。 我读了另一篇文章,显示了使用@AfterMapping而非abstract class的示例。

使用interface注释是否强制使用abstract class

2 个答案:

答案 0 :(得分:0)

您不能传递对象(假定该对象是不可变的)。您应该通过构建器..像这样:

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface ConfiguracionReautorizacionMapper {

    ConfiguracionReautorizacionDTO toConfiguracionReautorizacionDTO(final ConfiguracionReautorizacion configuracionReautorizacion);

    ConfiguracionReautorizacion toConfiguracionReautorizacion(final ConfiguracionReautorizacionDTO configuracionReautorizacionDTO);

    @AfterMapping
    default void fillServiciosAsociados(@MappingTarget final ConfiguracionReautorizacionDTO.Builder configuracionReautorizacionDTO, final ConfiguracionReautorizacion configuracionReautorizacion) {
        configuracionReautorizacionDTO.setTieneRolesOServiciosAsociados(!(CollectionUtils.isEmpty(configuracionReautorizacion.getRolesAplicacionEdesk()) && CollectionUtils.isEmpty(configuracionReautorizacion.getRolesAplicacionEdesk())));
    }

}

检出MapStruct issue 1556。您还可以从1.3.1开始禁用构建器

答案 1 :(得分:0)

当您同时使用 Lombok builder 和 mapstruct 时。尽管您传递了 Builder 对象,但 @AfterMapping 并没有多大用处,因为我们无法检索处理后的值。相反,我在映射器中使用了自定义方法来解决此问题。

@Mapping(target ="field", expression = "java(customMethod(obj))")

这解决了我的用例,希望它也能帮助其他人。