2013-08-06 14 views
6

Sto provando a iniettare un costruttore che accetta alcuni argomenti. Dopo aver compilato i reclami di Spring, non è stato possibile trovare un costruttore predefinito (non l'ho definito) e lancia BeanInstatiationException e NoSuchMethodException.È richiesto il costruttore predefinito in Spring injection?

Dopo aver definito un costruttore predefinito, le eccezioni non vengono più visualizzate, tuttavia il mio oggetto non viene mai inizializzato con il costruttore di argomenti, viene chiamato solo quello predefinito. Spring richiede davvero un costruttore predefinito in questo caso? E se sì, come posso usare il costruttore di argomenti invece di quello predefinito?

È così possibile cablare tutto: configurazione

public class Servlet { 

    @Autowired 
    private Module module; 

    (code that uses module...) 
} 

@Component 
public class Module { 

    public Module(String arg) {} 
    ... 
} 

Bean:

<beans> 
    <bean id="module" class="com.client.Module"> 
    <constructor-arg type="java.lang.String" index="0"> 
    <value>Text</value> 
    </constructor-arg> 
    </bean> 

    ... 
</beans> 

traccia stack:

WARNING: Could not get url for /javax/servlet/resources/j2ee_web_services_1_1.xsd 
ERROR initWebApplicationContext, Context initialization failed 
[tomcat:launch] org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 'module' defined in URL [...]: Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: Could not 
instantiate bean class [com.client.Module]: No default constructor found; nested 
exception is java.lang.NoSuchMethodException: com.client.Module.<init>() 
+0

Spring non richiede un costruttore predefinito (ovvero no-args, giusto?). Aggiungi lo stacktrace al post, altrimenti non penso che abbiamo abbastanza informazioni per dire cosa sta succedendo. –

+0

Aggiunta la traccia dello stack. E sì, per impostazione predefinita intendo costruttore no-args. – agerrr

risposta

7

Primavera solo "richiede" un costruttore di default se si pensa di istanzialo senza argomenti.

per esempio, se la tua classe è così;

public class MyClass { 

    private String something; 

    public MyClass(String something) { 
    this.something = something; 
    } 

    public void setSomething(String something) { 
    this.something = something; 
    } 

} 

e lo si imposta in primavera in questo modo;

<bean id="myClass" class="foo.bar.MyClass"> 
    <property name="something" value="hello"/> 
</bean> 

si otterrà un errore. il motivo è che Spring istanzia la tua classe new MyClass() quindi prova a impostare la chiamata setSomething(..).

così, invece, il xml Spring dovrebbe apparire così;

<bean id="myClass" class="foo.bar.MyClass"> 
    <constructor-arg value="hello"/> 
</bean> 

modo da avere uno sguardo alla vostra com.client.Module e vedere come la sua configurazione in XML primavera

+0

Penso di aver fatto tutto correttamente, ho incluso la mia implementazione nella domanda. Se non si specifica il costruttore predefinito, Spring lamenta e il codice non viene compilato, se lo faccio, viene utilizzato solo il costruttore predefinito, il costruttore dell'argomento viene ignorato. Non capisco perché. – agerrr

2

appena affrontato lo stesso problema, credo che fino ad ora si potrebbe avere risolto il problema.
Qui di seguito è quello che si potrebbe avere cambiato la configurazione di fagioli a,

<bean id="module" class="com.client.Module"> 
     <constructor-arg value="Text"/> 
</bean> 
4

Molto probabilmente si sta utilizzando componenti di scansione e dal momento che si definisce annotazione @Component per il modulo di classe si tenta di creare un'istanza il fagiolo. Non è necessaria l'annotazione @Component se si utilizza XML per la definizione del bean.

Problemi correlati