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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:20:01