2013-03-05 81 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