如何一起使用mapstruct和springboot bean?@自动连线

dai*_*i21 8 java javabeans autowired spring-boot mapstruct

@Mapper(componentModel = "spring")
public interface DemoConvert {
    public static DemoConvert INSTANCE = mappers.getMapper(DemoConvert.class);

    @AutoWired
    private PersonInfoSearchService personInfoSearchService;

    @Mapping(source = "name", target = "name")
    @Mapping(source = "id", target = "gender", expression = "java(personInfoSearchService.searchGenderById(id))")
    PersonDTO toPerson(TeacherDTO teacherDTO);
}
Run Code Online (Sandbox Code Playgroud)

如何一起使用mapstruct和springboot bean?@自动连线

Geo*_*vov 18

您需要将接口更改为抽象类并将PersonInfoSearchService调用移至@Named方法:

@Mapper(componentModel = "spring")
public abstract class DemoConvert {

    @Autowired
    private PersonInfoSearchService personInfoSearchService;

    
    @Mapping(source = "name", target = "name")
    @Mapping(source = "id", target = "gender", qualifiedByName = "mapGenderFromId")
    public abstract PersonDTO toPerson(TeacherDTO teacherDTO);


    @Named("mapGenderFromId")
    String mapGenderFromId(Long id) { // return type of gender, I took String. For id took Long
        return personInfoSearchService.searchGenderById(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,您不需要声明INSTANCE变量,因为您正在使用componentModel = "spring". 您可以简单地将映射器自动连接到其他 spring bean 中。