从spring 3.2升级到spring 4.0(NoSuchBeanDefinitionException)

时间:2013-12-11 00:04:55

标签: spring

我刚刚从3.2开始更新到春季4.0.0.RC2但是现在我得到了以下的预期

org.springframework.beans.factory.NoSuchBeanDefinitionException
运行测试时,我的dao类上的

。它自动装配PersistenceContext(这是我们自己的泛型类)时失败。

@Repository
public class AccountDaoImpl extends AbstractDao<Account> implements AccountDao {

    @Autowired
    public AccountDaoImpl(final PersistenceContext<Account> context) {
        super(context);
    }

...

如果我将版本更改回3.2,一切正常。 4.0中导致此问题的不同之处是什么?

1 个答案:

答案 0 :(得分:1)

这很可能是因为您注入的bean使用不同的(比Account)类型参数声明。 Spring Framework 4现在执行更严格的类型检查。

这是一个说明问题的示例(使用SF 3.2.3.RELEASE进行测试,并使用4.0.0.RC2失败):

@ContextConfiguration(classes=GenericAutowireTest.TestConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class GenericAutowireTest {

    public static class MyGenericClass<T> {
    }

    @Configuration
    public static class TestConfig {

        @Bean
        public MyGenericClass<String> myGenericClass() {
            return new MyGenericClass<String>();
        }
    }

    @Autowired 
    private MyGenericClass<Integer> myObject;

    @Test
    public void test() {
        assertNotNull(myObject);
    }

}

以下是关于此新功能的a nice article

解决方案是为@Autowired返回类型设置“接受”@Bean字段类型,例如使它们相同,包括参数化类型。只有这在运行时才有意义。