2013-08-06 11 views
6

Próbuję wstawić konstruktor, który ma pewne argumenty. Po kompilacji Spring narzeka nie może znaleźć domyślnego konstruktora (nie zdefiniowałem go) i wyrzuca BeanInstatiationException i NoSuchMethodException.Czy domyślny konstruktor jest wymagany przy wtrysku sprężyny?

Po zdefiniowaniu domyślnego konstruktora wyjątki nie są już wyświetlane, jednak mój obiekt nigdy nie jest inicjowany za pomocą konstruktora argumentów, wywoływany jest tylko domyślny. Czy Spring naprawdę wymaga w tym przypadku domyślnego konstruktora? A jeśli tak, jak mogę użyć konstruktora argumentów zamiast domyślnego?

To jak ja podłączyć wszystko: konfigurację

public class Servlet { 

    @Autowired 
    private Module module; 

    (code that uses module...) 
} 

@Component 
public class Module { 

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

Fasola:

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

    ... 
</beans> 

Ślad stosu:

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

Wiosna nie wymaga domyślnego konstruktora (czyli nie-args, prawda?). Dodaj stos stosu do postu, w przeciwnym razie nie sądzę, że mamy wystarczająco dużo informacji, aby powiedzieć, co się dzieje. –

+0

Dodano ślad stosu. I tak, domyślnie mam na myśli konstruktor no-args. – agerrr

Odpowiedz

7

Wiosna tylko "wymaga" konstruktor domyślny, jeśli plan tworzenie instancji bez żadnych argumentów.

na przykład, jeśli twoja klasa jest podobna do tej;

public class MyClass { 

    private String something; 

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

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

} 

i ustawić go na wiosnę w ten sposób;

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

pojawi się błąd. Powodem jest to, że Spring tworzy instancję klasy new MyClass(), a następnie próbuje ustawić wywołanie setSomething(..).

więc zamiast tego, Spring xml powinien wyglądać tak;

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

więc przyjrzeć się swoim com.client.Module i zobaczyć, jak jego skonfigurowane w wiosennym xml

+0

Myślę, że zrobiłem wszystko poprawnie, włączyłem moją implementację do pytania. Jeśli nie podam domyślnego konstruktora, Spring się skarży i kod się nie skompiluje, jeśli tak zrobię, użyty zostanie tylko domyślny konstruktor, konstruktor argumentów zostanie zignorowany. Nie rozumiem, dlaczego. – agerrr

2

Tylko w obliczu tego samego problemu, myślę, do tej pory mogłeś rozwiązać ten problem.
Poniżej jest to, co mogłeś zmienił konfigurację Bean,

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

Najprawdopodobniej używasz component-skanowanie, a ponieważ można zdefiniować adnotacji @Component modułu klasy próbuje instancji fasola. Nie potrzebujesz adnotacji @Component, jeśli używasz XML do definicji fasoli.

Powiązane problemy