2013-08-06 23 views
6

Tôi đang cố gắng tiêm một hàm tạo cần một số đối số. Sau khi biên dịch Spring phàn nàn nó không thể tìm thấy một constructor mặc định (tôi đã không định nghĩa nó) và ném BeanInstatiationException và NoSuchMethodException.Có phải hàm tạo mặc định được yêu cầu trong Spring injection không?

Sau khi xác định hàm khởi tạo mặc định, các ngoại lệ không xuất hiện nữa, tuy nhiên đối tượng của tôi không bao giờ được khởi tạo với hàm tạo đối số, chỉ có một hàm mặc định được gọi. Spring có thực sự yêu cầu một constructor mặc định trong trường hợp này không? Và nếu có, làm thế nào tôi có thể làm cho nó sử dụng constructor đối số thay vì một mặc định?

Đây là cách tôi dây tất cả mọi thứ: Cấu hình

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> 

Stack trace:

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 không yêu cầu hàm tạo mặc định (nghĩa là no-args, right?). Thêm stacktrace vào bài viết, nếu không tôi không nghĩ rằng chúng tôi có đủ thông tin để kể những gì đang xảy ra. –

+0

Đã thêm dấu vết ngăn xếp. Và có, theo mặc định tôi có nghĩa là constructor không có arg. – agerrr

Trả lời

7

mùa xuân chỉ "đòi hỏi" một constructor mặc định nếu bạn có kế hoạch instantiating nó mà không có bất kỳ đối số. Ví dụ:

chẳng hạn, nếu lớp của bạn giống như thế này;

public class MyClass { 

    private String something; 

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

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

} 

và bạn thiết lập nó trong mùa xuân như thế này;

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

bạn sẽ gặp lỗi. lý do là Spring khởi tạo lớp học của bạn new MyClass() sau đó cố gắng thiết lập cuộc gọi setSomething(..).

vì vậy thay vào đó, xml mùa xuân sẽ trông như thế này;

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

nên có một cái nhìn tại com.client.Module của bạn và xem cách nó được cấu hình trong xml mùa xuân của bạn

+0

Tôi nghĩ rằng tôi đã làm mọi thứ một cách chính xác, tôi bao gồm việc thực hiện của tôi trong câu hỏi. Nếu tôi không chỉ định constructor mặc định, Spring than phiền và mã không biên dịch, nếu tôi làm, chỉ có constructor mặc định đang được sử dụng, hàm tạo đối số sẽ bị bỏ qua. Tôi không hiểu tại sao. – agerrr

2

Chỉ phải đối mặt với cùng một vấn đề, tôi đoán cho đến bây giờ bạn có thể giải quyết được vấn đề.
Dưới đây là những gì bạn có thể thay đổi cấu hình của bạn để đậu,

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

lẽ Hầu hết các bạn đang sử dụng thành phần quét và kể từ khi bạn xác định chú thích @Component cho lớp module nó cố gắng để nhanh chóng đậu. Bạn không cần chú thích @Component nếu Bạn đang sử dụng XML để định nghĩa bean.

Các vấn đề liên quan