Mapstruct - 没有合格的 bean 类型

Mat*_*ley 6 java spring spring-boot mapstruct

我尝试自动装配我的映射结构映射器:

@Mapper(uses = {
                A.class,
                B.class,
                C.class
        })
public interface WindowDtoMapper {

    WindowDtoMapper INSTANCE = Mappers.getMapper(WindowDtoMapper.class);
    DetailedDto mapToDetailedDto(Window window);
    ReadDto mapToReadDto(Window window);
}
Run Code Online (Sandbox Code Playgroud)

这有效:

return WindowDtoMapper.INSTANCE.mapToDetailedDto(window)
Run Code Online (Sandbox Code Playgroud)

但为什么我不能使用:

@RequiredArgsConstructor
public class AAA(){
private final WindowDtoMapper windowDtoMapper;


windowDtoMapper.mapToDetailedDto(window)
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

引起原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“pl.comp.window.application.mapper.WindowDtoMapper”类型的合格 bean:预计至少有 1 个符合自动装配候选资格的 bean。依赖注释:{} 位于 org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1717) 位于 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1273)

也许我应该继续使用第一个可行的解决方案?这是不好的解决方案吗?

chr*_*ke- 8

默认情况下,MapStruct 生成普通的 Java 类,仅此而已。Spring 无法知道您希望这些成为 Bean。

如MapStruct 文档中所述,您可以使用@Mapper(componentModel = "spring")MapStruct 将其放在@Component它创建的类上(您需要确保包含映射器的包正在被组件扫描)。

  • 我遇到了完全相同的异常,但是是在 Junit 测试中。映射器接口已设置为使用`componentModel = "spring"`,并且测试用例文件本身使用`@SpringJUnitConfig(classes = {MetadataServiceImpl.class})`进行注释。运行此测试用例时,我还需要添加其他内容才能使映射器在 ApplicationContext 中可用吗? (4认同)