2011-09-20 10 views
24

Non voglio creare un costruttore predefinito per la mia classe auditRecord.Spring richiede che tutti i bean abbiano un costruttore predefinito?

ma la primavera sembra insistere su di esso:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'auditRecord' defined in ServletContext resource 
[/WEB-INF/applicationContext.xml]: 
Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [com.bartholem.AuditRecord]: 
No default constructor found; 
nested exception is 
java.security.PrivilegedActionException: 
java.lang.NoSuchMethodException: 
com.bartholem.AuditRecord 

questo è davvero necessario?

+0

Si prega di mostrare la vostra configurazione che carica il fagiolo - XML ​​o annotazioni – atrain

+0

https://stackoverflow.com/questions/25272543/no-default-constructor-found-nested-exception-is-java-lang-nosuchmethodexceptio – newday

risposta

1

Potreste essere in grado di fare l'iniezione a base costruttore, vale a dire una cosa del genere (tratto da documenti trovati here)

<bean id="foo" class="x.y.Foo"> 
    <constructor-arg ref="bar"/> 
    <constructor-arg ref="baz"/> 
</bean> 

ma non sono sicuro che funzionerà.

Se si sta definendo un JavaBean, è necessario seguire la convenzione e inserire un costruttore no-arg pubblico su di esso.

28

No, non è necessario utilizzare i costruttori predefiniti (no arg).

Come hai definito il bean? Suona come si può avere detto di primavera per istanziare il vostro qualcosa di fagioli come uno di loro:

<bean id="AuditRecord" class="com.bartholem.AuditRecord"/> 

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord"> 
    <property name="someProperty" val="someVal"/> 
</bean> 

dove non hai fornito un argomento del costruttore. Il precedente utilizzerà i costruttori predefiniti (o no arg). Se si desidera utilizzare un costruttore che prende in argomenti, è necessario specificare loro con l'elemento constructor-arg in questo modo:

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord"> 
    <constructor-arg val="someVal"/> 
</bean> 

Se si desidera fare riferimento un altro bean nel contesto di applicazione, è possibile farlo utilizzando la ref attributo dell'elemento constructor-arg anziché dell'attributo val.

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord"> 
    <constructor-arg ref="AnotherBean"/> 
</bean> 

<bean id="AnotherBean" class="some.other.Class" /> 
18

La risposta di nicholas è giusta sul denaro per la configurazione XML. Vorrei solo far notare che quando si usano le annotazioni per configurare i fagioli, non è solo più semplice per fare l'iniezione costruttore, è un modo molto più naturale per farlo:

class Foo { 
    private SomeDependency someDependency; 
    private OtherDependency otherDependency; 

    @Autowired 
    public Foo(SomeDependency someDependency, OtherDependency otherDependency) { 
     this.someDependency = someDependency; 
     this.otherDependency = otherDependency; 
    } 
} 
+1

Ho un piccolo problema con quello. Questa annotazione funziona in una parte dell'applicazione, ma nel test ottengo un errore 'no constructor-argument'. Potresti dire se esiste un modo per risolverlo senza iniettare argomenti o aggiungere un costruttore predefinito? –

+0

@JohnDoe: è necessario fare una nuova domanda piuttosto che postare un commento ad una risposta molto vecchia. Inoltre, se questo è tutto ciò che c'è nella tua domanda, non otterrai una buona risposta. Includi tracce dello stack e codice di esempio come appropriato per dimostrare il tuo problema. Vedi [SSCCE] (http://sscce.org/). Vedi anche [Come chiedere] (http://stackoverflow.com/questions/how-to-ask). –

+0

Probabilmente hai ragione, prenderò in considerazione la creazione di post. –

Problemi correlati