You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对MapStruct生成的类使用@SpyBean?实例化异常求助

是否可以对MapStruct生成的类使用@SpyBean注解?

我定义的MapStruct映射器接口如下:

@Mapper
public interface EMapper {
    Foo convert(Boo boo);
}

在测试类中尝试注入时:

class ControllerTest {
    @Autowired
    MockMvc mvc;

    @SpyBean
    EMapper mapper;
}

出现如下错误:

实例化Bean失败;嵌套异常为org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.EMapper]: Specified class is an interface


可以用@SpyBean,但问题根源在于:MapStruct的映射器接口本身不是Spring Bean,Spring实际管理的是MapStruct自动生成的接口实现类。直接对接口用@SpyBean时,Spring找不到可实例化的具体类,所以抛出了这个错误。

解决方法有几种:

  • 直接注入生成的实现类
    MapStruct默认生成的实现类命名是「接口名+Impl」,比如这里是EMapperImpl。直接把@SpyBean的类型换成实现类即可:
@SpyBean
EMapperImpl mapper;

注意:如果通过@Mapper的implementationName属性自定义了实现类名称,要同步修改这里的类名。

  • 保留接口类型,指定Bean名称
    MapStruct生成的Spring Bean默认名称是接口名首字母小写(比如eMapper),可以通过名称指定要Spy的Bean:
@SpyBean(name = "eMapper")
EMapper mapper;

也可以用beanClass属性指定实现类,同时保持接口类型注入:

@SpyBean(beanClass = EMapperImpl.class)
EMapper mapper;

另外别忘了,必须给MapStruct映射器接口加上Spring组件模型配置,这样生成的实现类才会被Spring扫描注册为Bean:

@Mapper(componentModel = "spring")
public interface EMapper {
    Foo convert(Boo boo);
}

内容的提问来源于stack exchange,提问作者user19282140

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:35:26