Spring isn't resolving the appropriate constructor

267 views Asked by At

Gratitude: Thanks for your support.

Problem Description:

  1. I am facing an exception while trying to run the below code. Don't even have a clue.
  2. How to write the xml definition to initiate Dependent class using @Autowired Constructor with int parameter.

ExceptionMessage:

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

filename: spring-context.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:c="http://www.springframework.org/schema/c"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

   <context:component-scan base-package="com.learning.spring.constinjection" />

   <bean id="dependency" class="com.learning.spring.constinjection.Dependency"></bean>

   <bean id="dependent" class="com.learning.spring.constinjection.Dependent">
        <constructor-arg ref="dependency" name="dpcy" />
        <constructor-arg name="mesg" value="Hi this is a test mesg" />
   </bean> 

   <bean id="dependent2" class="com.learning.spring.constinjection.Dependent" 
        c:mesg="Hi, this is another test mesg" /> 


 </beans>

filename: Dependent.java

public class Dependent {

    Dependency dpcy;

    Dependent(Dependency dpcy, String mesg){
      this.dpcy = dpcy;
      System.out.println("Message is: " + mesg);
    }

    Dependent(String mesg){
      System.out.println("Only Message is: " + mesg);
    }

    @Autowired
    Dependent(Integer ticketno){
      System.out.println("Ticket no is: " + ticketno);
    }

}

filename: Dependency.java

public class Dependency {

  Dependency(){
      System.out.println("Dependency loaded successfully");
  }

}

filename: ConstructorInjectionApp

public class ConstructorInjectionApp {
        public static void main(String[] args) {

        GenericXmlApplicationContext gen = new GenericXmlApplicationContext();
        gen.load("classpath:simplespringconstinjection.xml");
        gen.refresh();
        Dependent d = (Dependent) gen.getBean("dependent");
        Dependent d2 = (Dependent) gen.getBean("dependent2");   
}
}
1

There are 1 answers

1
StvnBrkdll On BEST ANSWER

By changing this:

<bean id="dependent" class="com.learning.spring.constinjection.Dependent">
        <constructor-arg ref="dependency" name="dpcy" />
        <constructor-arg name="mesg" value="Hi this is a test mesg" />
   </bean> 

to this:

<bean id="dependent" class="com.learning.spring.constinjection.Dependent" 
        c:dpcy-ref="dependency" c:mesg="Hi, this is another test mesg" />

I was able to get the ApplicationContext to properly initialize with no errors.

See this Spring doc for information on the "c" namespace.

There is still an issue with the constructor with the @Autowired annotation.