2012-02-15 45 views
12

Tôi đang gặp vấn đề với bộ điều khiển Mùa xuân của tôi - tôi nhận được không có constructor mặc định tìm thấy - nhưng họ có một constructor mà tôi đang cố gắng để tạo ra thông qua các applicationContext.xml - heres chút liên quan:Spring MVC không tìm thấy hàm tạo mặc định?

<bean id="PcrfSimulator" class="com.rory.services.pcrf.simulator.PcrfSimulator" init-method="start"> 
</bean> 

<bean id="CacheHandler" class="com.rory.services.pcrf.simulator.handlers.CacheHandler"> 
    <constructor-arg index="0" type="com.rory.services.pcrf.simulator.CustomGxSessionIdCacheImpl"> 
     <bean factory-bean="PcrfSimulator" factory-method="getGxSessionIdCache"> 
     </bean> 
    </constructor-arg>  
</bean> 

Tức là Tôi đang tạo ra một bean đầu tiên, và sau đó cố gắng để vượt qua kết quả của một cuộc gọi phương thức từ bean đó vào phương thức khởi tạo của bean thứ hai (CacheHandler).

Here'e đầu CacheHandler:

@Controller 
    public class CacheHandler { 

    private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

    public CacheHandler(CustomGxSessionIdCacheImpl gxSessionIdCache) { 
     this.gxSessionIdCache = gxSessionIdCache; 
    } 

Đây là lỗi tôi nhận được:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheHandler' defined in URL [jar:file:/users/rtorney/Documents/apache-tomcat-7.0.25/webapps/PCRFSimulator-4.0/WEB-INF/lib/PCRFSimulator-4.0.jar!/com/rory/services/pcrf/simulator/handlers/CacheHandler.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.rory.services.pcrf.simulator.handlers.CacheHandler]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.rory.services.pcrf.simulator.handlers.CacheHandler.<init>() 

Bất kỳ giúp đỡ được nhiều đánh giá cao!

Trả lời

20

Bạn nên xác định hạt của mình bằng xml hoặc chú thích chúng, chứ không phải cả hai (nếu chỉ để tránh lỗi giống như lỗi bạn đang nhận).

Vấn đề ở đây là bạn không phải nhà xây dựng tự động args, do đó, mùa xuân không biết phải làm gì với bộ điều khiển của bạn. Nó biết nó phải tạo ra một bean (chú thích @Controller), nhưng nó không biết làm thế nào (không có constructor mặc định, cũng không phải autowired).

Bạn có thể cố gắng làm một cái gì đó như:

@Controller 
public class CacheHandler { 

private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

@Autowired 
public CacheHandler(CustomGxSessionIdCacheImpl gxSessionIdCache) { 
    this.gxSessionIdCache = gxSessionIdCache; 
} 

và sau đó trong xml:

<bean id="gxSessionIdCache" 
    factory-bean="PcrfSimulator" 
    factory-method="getGxSessionIdCache"/> 

Vì vậy, nó sẽ autowire thông số constructor.

Một tùy chọn khác là chỉ cần tạo hàm tạo mặc định và thuộc tính tự động gxSessionIdCache.

+0

chúng tôi chia sẻ những ý tưởng tương tự ;-) –

+0

Tuyệt vời, cảm ơn cho câu trả lời tất cả! – Rory

+1

tuyệt vời để xác nhận điều này, mùa xuân cần một trong hai constructor mặc định, hoặc tự động xây dựng có dây. – lwpro2

2

Bạn cần phải thêm một constructor mặc định rỗng:

@Controller 
    public class CacheHandler { 

    private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

    @Autowired 
    public CacheHandler(CustomGxSessionIdCacheImpl gxSessionIdCache) { 
     this.gxSessionIdCache = gxSessionIdCache; 
    } 

Nhưng hãy cẩn thận, bởi vì nó có vẻ như bạn đang trộn cấu hình chú thích dựa (@Controller) và cấu hình XML. Trong ví dụ trên, nó sử dụng cấu hình dựa trên chú thích (vì vậy vui lòng xóa khai báo bean khỏi tệp XML của bạn).

+1

Tại sao hàm tạo mặc định? Nó không phải là bắt buộc phải không? – kosa

+0

Tôi vừa chỉnh sửa bài đăng của mình. –

+0

[Spring có yêu cầu tất cả các bean phải có một hàm tạo mặc định không?] (Http://stackoverflow.com/questions/7492652/does-spring-require-all-beans-to-have-a-default-constructor): [* * không **] (http://stackoverflow.com/a/7492713/545127) – Raedwald

0

Bạn cũng có thể gặp lỗi này nếu bạn chưa kích hoạt cấu hình dựa trên chú thích của Spring. Bao gồm này trong Xml mùa xuân của bạn:

< bối cảnh: chú thích-config/>

0

áp phích khác đã chỉ ra rằng bạn có thể nhận ra vấn đề nếu bạn kết hợp autowiring/thành phần quét với instantiation rõ ràng của đậu. Tôi đã có một vấn đề tương tự với một ứng dụng web đã làm điều đó. Tôi đã có thể khắc phục vấn đề bằng cách nói cho máy quét thành phần không tự động khởi tạo một hạt của lớp quan trọng. Như thế này:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns=...> 

    <aop:aspectj-autoproxy /> 

    <import resource="repository.xml" /> 
    ... 

    <context:component-scan base-package="com.example.webserver"> 
     <context:exclude-filter type="regex" expression="MyRepositoryImpl" /> 
     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" /> 
    </context:component-scan> 
</beans> 

nơi repository.xml bao gồm instantiation đậu rõ ràng:

<beans xmlns=...> 
    <bean id="password" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:/comp/env/store/clientPassword" /> 
    </bean> 
    <bean id="repository" class="com.example.webserver.datalayer.MyRepositoryImpl"> 
     <constructor-arg ref="password" /> 
    </bean> 
... 
</beans> 
Các vấn đề liên quan