如何对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
相关产品推荐
相关产品推荐

