【问题标题】:spring bean issue with Set propertySet属性的spring bean问题
【发布时间】:2014-03-26 08:20:12
【问题描述】:

我有豆子,例如

<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>

service(SpecificService) 是使用抽象方法 init() 扩展抽象类 MyService 的类 并使用方法 specificLogic() 实现接口 MyInterface。

因此,管理器在服务对象上调用方法 init(),如下所示:

private Set<MyService> services;

public void init() {

    for (MyService service : services) {
        service.init();
    }



}

但是在 bean 初始化时我遇到了以下问题:

无法转换“java.util.LinkedHashSet”类型的属性值 属性“服务”所需的类型“java.util.Set”;嵌套异常是 java.lang.IllegalStateException: 无法将 [com.sun.proxy.$Proxy108 实现 com.MyInterface,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] 类型的值转换为所需类型 [ com.MyService] for property 'services[0]': 没有找到匹配的编辑器或转换策略。

【问题讨论】:

  • 使用 util 命名空间并创建一个 util:set bean。参考link
  • 是同样的问题。问题在于扩展抽象类并实现另一个接口。
  • 这不是SetLinkedHashSet 的问题。大约是com.MyInterface,org.springframework.aop.SpringProxycom.MyService。向我们展示代码的 AOP 部分。
  • 我没有 AOP 部分。

标签: java spring


【解决方案1】:

你确定你已经发布了你的所有配置吗? 因为代理了service bean,所以周围有一些AOP“隐藏”(可能是注释)代码。 你必须选择:

  1. private Set&lt;MyService&gt; services 的声明更改为`private Set services
  2. 在您的 AOP 代码中,让代理公开目标类 (MyService) 而不是接口 (MyInterface)

检查您的代码

【讨论】:

  • 我只使用这些注释:“@Override”“@Transactional”
  • 我不明白为什么不能使用 MyService,因为在 Manager 中我只想看到 init() 方法。为什么这个弹簧有问题?
  • @Transactional 使代理和 JDK 代理公开接口 (MyInterface) 而不是实现 (MyService)。看this答案
【解决方案2】:

也许您可以尝试初始化您的 Set 服务以进行初始化。

您刚刚将其声明为

private Set<MyService> services;

它只考虑接口 Set,在您的 bean 配置中,默认情况下该集合似乎是一个 LinkedHashSet。

所以您可以尝试初始化您的 Set 服务,例如:

 private Set<MyService> services = new LinkedHashSet<>();

【讨论】:

  • 还是一样,我认为问题在于继承抽象类接口的实现。因为在 Manager 类中我只使用抽象类类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2011-09-09
  • 2011-01-05
  • 1970-01-01
相关资源
最近更新 更多