将映射添加到模型映射器的问题

问题描述

我在将具有自定义 PropertyMap 定义的类添加到模型映射器时遇到了问题。只要我在我正在使用的类的 @postconstruct添加了映射,一切都在工作。另一方面,当我将它移动到我想要添加所有 PropertyMap 的新类时,似乎没有添加到模型映射器中。

使用此配置,一切正常。 RestCompanyDto 有对象 RestAddressDto,当我使用模型映射器的映射函数时,内部对象被正确转换。

@Service
@requiredArgsConstructor
public class RestOrganizationService {


    private final modelmapper modelmapper;
    private final RestAddressDtoMap addressDtoMap;
    

    @postconstruct
    public void mapperConfig() {
        modelmapper.addMappings(addressDtoMap);
    }

    private OfficeDto map(Long id,RestOfficeDto restOfficeDto){
        OfficeDto officeDto = modelmapper.map(restOfficeDto,OfficeDto.class);
        officeDto.setId(id);
        return officeDto;
    }

另一方面,当我从 RestOrganizationService 中删除 @postconstructor 并将其移动到新类时,地址对象的映射不起作用。

@配置

@AllArgsConstructor
public class EPRestMapperConfig {
    private final modelmapper modelmapper;
    private final RestAddressDtoMap restAddressDtoMap;

    @postconstruct
    public void init() {
        modelmapper.addMappings(restAddressDtoMap);
    }
}

这是PropertyMap的附加代码

@Service
public class RestAddressDtoMap extends PropertyMap<RestAddressDto,AddressDto> {

    private CityRepository cityRepository;
    private CityServiceImpl cityService;

    public RestAddressDtoMap(CityRepository cityRepository,CityServiceImpl cityService){
        super(RestAddressDto.class,AddressDto.class);
        this.cityRepository = cityRepository;
        this.cityService = cityService;
    }

    @Override
    protected void configure() {
        using(getCityDto).map(source.getCityId()).setCity(null);
    }


    private final Converter<Long,CityDto> getCityDto = context ->
            (context.getSource() != null
                    ? cityService.toDto(cityRepository.findOne(context.getSource()))
                    : null);


}

解决方法

在你的情况下,我建议使用以下方法:

@Configuration
public class EPRestMapperConfig {
    @Bean
    public ModelMapper modelMapper(RestAddressDtoMap restAddressDtoMap) {
        return new ModelMapper().addMappings(restAddressDtoMap);
    }

    @Bean
    public RestAddressDtoMap restAddressDtoMap() {
        return new RestAddressDtoMap();
    }
}

我喜欢这种创建 bean 的风格,因为您可以在 bean 创建过程中看到 bean 之间所需的依赖关系并设置所需的组件。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...