2017-01-05 3 views
-1

Dankbarkeit: Vielen Dank für Ihre Unterstützung.Spring löst nicht den entsprechenden Konstruktor

Problem Beschreibung:

  1. ich eine Ausnahme bin vor beim Versuch, den folgenden Code auszuführen. Habe keine Ahnung.
  2. So schreiben Sie die XML-Definition zum Initiieren der abhängigen Klasse mit @Autowired Constructor mit 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) 

Dateiname: feder 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> 

Dateiname: 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); 
    } 

} 

Dateiname:

Dependency.java
public class Dependency { 

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

} 

Dateiname: 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

Benötigen Sie * die @ autowired Annotation für den Konstruktor? Dependent? Es ist im Allgemeinen verwirrend, autoverzierte Annotationen mit xml/java-Definitionen zu mischen. – sisyphus

+0

Ya ist verwirrend, aber ich lerne nur Federn. Also dachte ich mir, ich sollte zuerst die Dinge lernen und mich dann für Best Practices entscheiden. –

+0

kann ich den Grund für den Downvote wissen? –

Antwort

0

Durch diese Veränderung:

<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> 

dazu:

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

konnte ich die ApplicationContext richtig initialisiert werden ohne Fehler erhalten.

Weitere Informationen zum Namensraum "c" finden Sie unter this Spring doc.

Es gibt immer noch ein Problem mit dem Konstruktor mit der @Autowired-Annotation.

+0

@SotiriosDelimanolis danke für die Hinweise. Ich war mit dem Namensraum "c" nicht vertraut. Ich machte auch einen schlampigen Job bei meiner ursprünglichen Antwort. – mangotang

Verwandte Themen