Как связать прокси объекты весной? - PullRequest
2 голосов
/ 21 января 2011

Я использую прокси-бины с выбираемым свойством транспортного протокола.Моя проблема в том, что свойства bean не могут быть преобразованы, но я действительно не знаю почему.Это ситуация:

Мое свойство: service.protocol = rmi

<!-- This is the 'multiplexing' factory bean (using this because properties
cannot be used in bean names and aliases -->

   <bean name="dbFormGenWindowComponent" 
  class="org.springframework.beans.factory.config.BeanReferenceFactoryBean">
  <property name="targetBeanName" value="dbFormGenWindowComponent-${service.protocol}invoker" />
 </bean>

<!-- Here are the service invoker beans with two protocols: -->

  <bean name="dbFormGenWindowComponent-rmiinvoker" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
 <property name="serviceUrl" value="${ringwindow.serviceURL.rmi}/${ringwindow.service.name}-dbFormGenWindowComponent"/>
 <property name="serviceInterface" value="foo.bar.service.formgen.windows.FormGenWindowComponent" />
 <property name="lookupStubOnStartup" value="false"/>
  </bean>

Исключение при запуске:

org.springframework.beans.TypeMismatchException: не удалось преобразовать значение свойства типа [$ Proxy541] в требуемый тип [foo.bar.service.formgen.windows.FormGenWindowComponent] для свойства 'formGenWindowComponent';вложенным исключением является java.lang.IllegalArgumentException: невозможно преобразовать значение типа [$ Proxy541] в требуемый тип [foo.bar.service.formgen.windows.FormGenWindowComponent] для свойства 'formGenWindowComponent': не найдено соответствующих редакторов или стратегии преобразования

Я думаю, что вложенные фабричные бобы должны работать нормально.У вас есть идеи, как получить эту работу?

1 Ответ

3 голосов
/ 21 января 2011

Обычно это происходит, когда вы определили типы точек внедрения как конкретные классы, а не интерфейсы, но вы используете прокси на основе интерфейса.Например:

public interface Foo { .. }
public class FooImpl { .. } // this is declared as bean

public class Bar {
    private FooImpl foo; // this fails
    private Foo foo; // correct way
}

В случае фабричных компонентов это может быть связано с тем, что тип возвращаемого значения фабричного компонента определяется как конкретный класс.Если вы не можете ничего изменить в классах, вы можете сконфигурировать Spring для использования cglib-proxying:*

<aop:aspectj-autoproxy proxy-target-class="true"> - изменяет это глобально
...