Java 具有Set属性的springbean问题
我有豆子Java 具有Set属性的springbean问题,java,spring,Java,Spring,我有豆子 <bean id="manager" class="com.Manager" init-method="init"> <property name="services"> <set> <ref bean="service" /> </set> </property> </bean> <bean id="myServic
<bean id="manager" class="com.Manager" init-method="init">
<property name="services">
<set>
<ref bean="service" />
</set>
</property>
</bean>
<bean id="myService"
class="com.MyService" abstract="true">
</bean>
<bean id="service" class="com.SpecificService" parent="myService">
</bean>
服务(SpecificService)是使用抽象方法init()扩展抽象类MyService的类
并使用方法specificLogic()实现接口MyInterface
因此,manager对服务对象调用方法init(),如下所示:
private Set<MyService> services;
public void init() {
for (MyService service : services) {
service.init();
}
}
专用集服务;
公共void init(){
for(MyService服务:服务){
service.init();
}
}
但当bean初始化时,我有以下问题:
无法转换“java.util.LinkedHashSet”类型的属性值
属性“services”的必需类型“java.util.Set”;嵌套异常为java.lang.IllegalStateException:无法将[com.sun.proxy.$Proxy108实现com.MyInterface、org.springframework.aop.SpringProxy、org.springframework.aop.framework.Advised]类型的值转换为属性“服务[0]”所需的[com.MyService]类型:找不到匹配的编辑器或转换策略
也许您可以尝试初始化Set服务以进行初始化 你刚刚宣布它是
private Set<MyService> services;
专用集服务;
它只考虑接口集,在bean配置中,默认情况下该集似乎是LinkedHashSet
因此,您可以尝试初始化设置服务,如:
private Set<MyService> services = new LinkedHashSet<>();
private Set services=new LinkedHashSet();
您确定已发布所有配置吗?
因为有一些AOP“隐藏”(可能通过注释)代码,因为service
bean是代理的。
您必须选择:
专用集服务的声明更改为`专用集服务
MyService
),而不是接口(MyInterface
)检查代码使用util名称空间并创建util:set bean。这是同样的问题。问题在于扩展抽象类和实现另一个接口。这不是
Set
和LinkedHashSet
的问题。它是关于com.MyInterface,org.springframework.aop.SpringProxy
和com.MyService
。向我们展示代码的AOP部分。我没有AOP部分。尽管如此,我认为问题在于接口的继承抽象类a实现。因为在Manager类中我只使用抽象类类型。我只使用这些注释:“@Override”“@Transactional”我不明白为什么不能使用MyService,因为在Manager中我只想看到init()方法。为什么spring在这方面有问题?@Transactional make proxy和JDK proxy公开接口(MyInterface)而不是实现(MyService)。看答案