2013-03-05 39 views
0

即時通訊目前與以下的javax注入提供商註釋創建一個Spring bean:在初始化方法之一java的春天javax.inject.provider投擲類轉換異常

@Autowired 
Provider<Table> provider; 

我打電話:

This throws:java.lang.ClassCastException:$ Proxy127

該表配置爲

@Component 
@Scope(BeanDefinition.SCOPE_PROTOTYPE) 
public class Table extends Furniture< 
     Square, 
     Round> { 

    ............... 
    ............... 

} 

與父類是抽象:

public abstract class Furniture< 
    E extends Legs, 
    M extends Corners> { 

    ............. 
    ............. 

} 

任何人有,爲什麼我不能要在INIT創建一個實例什麼想法?

我知道春天有使用查找方法注入方法,但我真的不想使用XML。

+0

也許我需要使用@inject?...但@autowire和注入應該是相同的? – user1555190 2013-03-05 15:07:44

回答

0

似乎供應商返回的bean被代理。嘗試提取Table類可以實現的接口,並改爲使用Provider<TableInterface>。然後你就可以得到這樣一個實例:

TableInterface table = provider.get(); 

這仍將返回Proxy,但你不會得到這一任務的ClassCastException,因爲代理實現TableInterface接口。

另一種可能性是使用CGLIB啓用類代理,在這種情況下,您不需要提取接口。

+0

是的,我的傢俱類已經有一個接口,但該接口是在不同的類之間共享..在這種情況下,我想要一個表的實例..不是椅子......有可能給它一個接口,然後指定哪個類實例我想創建和包裝的代理? – user1555190 2013-03-05 16:41:44

+0

會這樣工作? – user1555190 2013-03-05 16:50:13

+0

是的,它應該。您需要了解兩種[代理機制]之間的區別(http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-proxying)。更輕量級的JDK代理只能實現接口,但不能擴展具體的類。因此,一個JDK代理永遠不可能是一個'Table',它只能包裝它,實現'Table'實現的接口,並委託在這些接口中定義的方法。通過'proxy-target-class =「true」'你可以使用更強大的CGLIB代理,並且可以擴展具體的類。 – zagyi 2013-03-05 16:54:46