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是代理的。 您必须选择:

  • 专用集服务的声明更改为`专用集服务
  • 在AOP代码中,让代理公开目标类(
    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)。看答案