@AfterMapping 不是从@Mapper 接口调用的

Jos*_*rán 3 java mapstruct

我在使用 Mapstruct 时遇到问题。

我正在使用@Mapper带有@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())));
    }

}
Run Code Online (Sandbox Code Playgroud)

映射器工作正常,但@AfterMapping从未调用该方法。我阅读了其他帖子,其中显示了使用abstract class而不是interface.

abstract class使用@AfterMapping注释是强制性的吗?

Spi*_*rit 19

这是使用Lombok#@Builder和时的一个错误Mapstruct@AfterMapping

请利用这种情况@BeanMapping(builder = @Builder(disableBuilder = true))

请参阅https://github.com/mapstruct/mapstruct/issues/1556#issuecomment-1011493330

  • 如果您使用“@Mapper”,它也可以工作。以下内容对我有用`@Mapper(builder = @Builder(disableBuilder = true))` (2认同)

Sja*_*aak 7

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

@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())));
    }

}
Run Code Online (Sandbox Code Playgroud)

结帐 MapStruct问题 1556 .. 您还可以从 1.3.1 开始禁用构建器

  • 这个解决了我的问题。我必须从我的类中删除 @Builder 注释。 (2认同)
  • @Clawdidr这可能是一个答案:所以`@Builder`注释使mapstruct`@AfterMapping`失败! (2认同)
  • 谢谢。这适合我的情况。但是当我们将构建器传递给后映射时它是没有用的,我需要更新基类而不是构建器一 (2认同)

raj*_*aji 7

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

@Mapping(target ="field", expression = "java(customMethod(obj))")
Run Code Online (Sandbox Code Playgroud)

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