我在使用 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
您不能传递对象(假定它是不可变的)。你应该通过 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 开始禁用构建器
当您同时使用 Lombok 构建器和 Mapstruct 时。尽管您传递了 Builder 对象,但 @AfterMapping 并没有多大用处,因为我们无法检索处理后的值。相反,我在映射器中使用了自定义方法来解决此问题。
@Mapping(target ="field", expression = "java(customMethod(obj))")
Run Code Online (Sandbox Code Playgroud)
这解决了我的用例,希望对其他人也有帮助。
| 归档时间: |
|
| 查看次数: |
3745 次 |
| 最近记录: |