Spring 2.5.6升级至Spring 5.3.29:getBean方法编译类型不兼容错误
Spring 2.5.6 迁移至 Spring 5.3.29 编译错误解决
我们在从Spring 2.5.6迁移到Spring 5.3.29时,以下代码出现编译错误:
package aaa.bbb.ccc.util.buscador; import aaa.bbb.ccc.dto.SBFormDto; import aaa.bbb.ccc.dto.buscador.BusquedaDto; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component("bDtoFactory") public class BDtoFactoryImpl implements BDtoFactory { private static final String BL = "bl"; private static final String BP = "bp"; @Autowired BeanFactory beanFactory; public BusquedaDto crearBL(String textoLibre) { return (BusquedaDto) beanFactory.getBean(BL, new Object[] { textoLibre }); } public BusquedaDto crearBP(SBFormDto formulario) { return (BusquedaDto) beanFactory.getBean(BP, new Object[] { formulario }); } }
已知Spring的API变更:旧版已废弃的Object getBean(String name, Object[] args)方法,在新版中被Object getBean(String name, Object... args)替代,但传入Object[]数组时出现如下编译错误:
[ERROR] BDtoFactoryImpl.java:[20,74] incompatible types: java.lang.Object[] cannot be converted to java.lang.Class [ERROR] BDtoFactoryImpl.java:[24,78] incompatible types: java.lang.Object[] cannot be converted to java.lang.Class
问题原因
Java的可变参数(Object...)匹配逻辑导致了这个问题:当传入Object[]作为第二个参数时,编译器会错误匹配BeanFactory的另一个重载方法Object getBean(String name, Class requiredType)——因为Object[]本身是Class类型的实例,所以编译器认为你想传递的是类型参数,而非构造参数数组。
修复方案
有两种简单的修复方式:
方式一:直接传递参数(推荐)
利用可变参数特性,直接传入参数,无需手动包装成数组:
public BusquedaDto crearBL(String textoLibre) { return (BusquedaDto) beanFactory.getBean(BL, textoLibre); } public BusquedaDto crearBP(SBFormDto formulario) { return (BusquedaDto) beanFactory.getBean(BP, formulario); }
方式二:强制转型匹配可变参数
如果必须保留数组形式,可将数组强制转型为Object,引导编译器选择可变参数版本:
public BusquedaDto crearBL(String textoLibre) { return (BusquedaDto) beanFactory.getBean(BL, (Object) new Object[] { textoLibre }); } public BusquedaDto crearBP(SBFormDto formulario) { return (BusquedaDto) beanFactory.getBean(BP, (Object) new Object[] { formulario }); }
内容的提问来源于stack exchange,提问作者Ignacio Rafael
相关产品推荐
相关产品推荐

