`

spring在构造器注入时报错,类型不匹配

阅读更多

====================================>User.java

public class User {

private Integer id;

private String name;

private Integer age;

 

public User(){}

public User(Integer id, String name, Integer age) {

super();

this.id = id;

this.name = name;

this.age = age;

}

 

public Integer getId() {

return id;

}

//setter and getter method ......

}

===================================================>Test.java

@org.junit.Test

public void testCase(){

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

User user = (User)context.getBean("user");

System.out.println(user.getId()+":"+user.getName()+":"+user.getAge());

}

=====================================>applicationContext.xml

<bean id="user" class="com.ustcinfo.entity.User">

<constructor-arg index="0" type="int">

<value>1</value>

</constructor-arg>

<constructor-arg index="1" type="java.lang.String">

<value>scott</value>

</constructor-arg>

<constructor-arg index="2" type="java.lang.Integer">

<value>30</value>

</constructor-arg>

</bean>

用set方式不会报错,但是用构造器缺报错了:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'user' defined in class path resource [applicationContext.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)

at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:250)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1049)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:953)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)

at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)

at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)

at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)

at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)

at com.ustcinfo.entity.Test.testCase(Test.java:11)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)

at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)

at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)

at org.junit.runners.ParentRunner.run(ParentRunner.java:309)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

======================================>解决方案

看到红色加粗字体没?注意将type属性删除,只留一个index属性也是可以的(构造函数非重载的情况下),当然不删除最好,避免重载时出错,最好的解决办法是index和type同时配置。下面我来解释下为何添加上type属性后报错:注意我的实体类User中属性id是Integer类型,而applicationContext.xml中配置的是int,所以解决办法有两种,其一,将User中id类型改为int类型,其二,或者改applicationContext.xml配置为type="java.lang.Integer"

分享到:
评论

相关推荐

    基于SpringBoot构造器注入循环依赖及解决方式

    在Spring Boot应用中,构造器注入是一种常见的依赖注入方式,但它可能会引发循环依赖的问题。循环依赖是指两个或多个Bean之间形成一个闭环,彼此依赖对方,导致Spring容器在初始化Bean时无法确定创建顺序,从而抛出...

    spring setter 和构造 注入 例子 spring 4.2.0

    总结来说,Spring的setter和构造注入是实现依赖注入的关键技术,它们提供了灵活且强大的方式来管理对象间的依赖关系,从而提高代码的可维护性和测试性。在实际项目中,开发者可以根据需求和场景选择合适的注入方式。

    spring介绍(set和构造器注入)

    标题中的“spring介绍(set和构造器注入)”是指在Spring框架中两种主要的依赖注入(Dependency Injection,简称DI)方式:setter注入和构造器注入。在Spring框架中,DI是一种核心特性,它允许我们解耦组件之间的关系...

    Spring依赖注入使用构造设注入demo

    3. **构造器注入**: 在`Client`类中,我们需要有一个带有`Service`参数的构造器,Spring会通过这个构造器注入`ServiceImpl`: ```java public class Client { private final Service service; public Client...

    Spring_0300_IOC_Injection_Type 构造器注入

    Spring支持多种类型的构造器注入,包括单一参数的构造器和多个参数的构造器。 1. 单一参数构造器注入 当只有一个参数时,Spring会自动匹配类型并调用相应的构造器。例如: ```java public class UserService { ...

    通过实例了解java spring使用构造器注入的原因

    构造器注入是 Spring 4.x 版本推荐的注入方式,通过在构造函数中注入依赖。这种方式可以保证依赖不可变,并且确保需要的依赖不为空。 2.3 Setter 注入 Setter 注入是 Spring 3.x 版本推荐的注入方式,通过 setter ...

    spring的setter注入和构造注入(XML讲解以及常见错误)

    3. **注入类型不匹配**:setter方法的参数类型与配置的值类型不匹配,也会导致注入失败。 4. **注入的bean不存在**:当试图注入一个在XML配置中未定义的bean时,Spring会抛出`NoSuchBeanDefinitionException`。 5....

    Java开发学习(六)----DI依赖注入之setter及构造器注入解析.doc

    Spring 框架基于这些知识点,为我们提供了两种注入方式:setter 注入和构造器注入。 二、setter 注入 setter 注入是指通过 setter 方法将依赖对象注入到 Bean 中。例如,在 BookServiceImpl 中定义了引用类型属性 ...

    Spring三种注入方式(三)

    在实际开发中,可以根据需求选择合适的方式,通常推荐使用构造器注入,因为它可以提供更好的类型安全性和明确的构造过程。 总结起来,Spring的依赖注入机制是其核心特性之一,它简化了对象间的依赖关系管理,提高了...

    Spring三种注入方式(一)

    在这里,`UserRepository`是`UserService`的依赖,Spring会自动寻找匹配类型的bean并注入。 其次,设值注入是通过setter方法来注入依赖。这种方式更为灵活,因为对象可以在创建后任何时候进行注入,但可能导致对象...

    Spring注入的方式

    - 在Spring中,可以通过`@Autowired`注解标记在构造函数上,Spring容器会自动匹配并注入相应的依赖。 - 示例:`example4forConstructor`可能是一个展示构造器注入的例子,其中包含一个或多个带注解的构造函数,...

    spring依赖注入

    Spring容器在创建对象时,会根据构造器的参数类型自动匹配并注入相应的bean。这种方式确保了对象在创建时就已经具备所有必需的依赖,提高了代码的稳定性。 其次,setter注入是通过在类中声明setter方法,Spring容器...

    Spring_Spring_教程8_注入_复杂类型的注入

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本教程将专注于Spring中的复杂类型注入,包括集合、自定义类以及...

    Spring 依赖注入 构造方法注入

    NULL 博文链接:https://zhangyulong.iteye.com/blog/856986

    Spring框架构造注入操作实战案例

    该变量将在构造器中被初始化,通过构造注入steelAxe bean实例作为参数传递给Chinese构造器。 在Spring框架中,构造注入可以通过两种方式实现,一种是使用constructor-arg元素,另一种是使用 @Autowired 注解。使用...

    spring的注入方式

    Spring提供了多种注入方式,包括set注入、构造注入和自动注入,让我们逐一深入探讨。 1. **Set注入** Set注入是最常见的注入方式,它通过setter方法来设置对象的依赖。首先,你需要在类中声明需要注入的属性,并...

    SpringIoc注入

    3. **接口注入**:Spring不直接支持,但在某些特殊情况下,可以通过实现特定接口并在接口中定义注入点来实现。 **三、@Autowired注解** `@Autowired`是Spring提供的一个注解,用于自动装配bean。它可以应用在字段...

    Spring Ioc 注解 依赖注入

    在这个例子中,UserService通过构造器注入的方式接收了一个UserRepository实例。UserService类被标记为@Service,表明它是一个业务层组件;UserRepository类被标记为@Repository,表明它是一个数据访问层组件。 ###...

    Spring系列之依赖注入的三种方式.docx

    使用构造器注入时,Spring 根据参数类型或索引来匹配构造函数参数。在这个例子中,`value` 属性对应于构造函数的参数值。 总结: - **setter 方法注入**:灵活性高,适用于可选依赖,但可能导致对象状态不一致。 ...

    关于spring boot中几种注入方法的一些个人看法

    当找不到与名称匹配的 bean 时才按照类型进行装配。@Resource 可以用在方法、属性、类上,通过 CommonAnnotationBeanPostProcessor 类实现依赖注入,与 @Autowired 一致。但可以指定 name 属性来指定 beanName,但...

Global site tag (gtag.js) - Google Analytics