org.springframework.beans.Исключение TypeMismatchException: не удалось преобразовать значение свойства типа [$Proxy133] в требуемый тип

#java #spring

#java #spring

Вопрос:

В applicationContext.xml У меня есть компонент ems :

 <bean id="ems" class="info.ems.EMSImpl" init-method="init">
    <property name="dao" ref="dao" />
    <property name="passwordEncoder" ref="passwordEncoder" />
    <property name="localeList" value="${ems.locales}" />
    <property name="releaseVersion" value="${ems.version}" />
    <property name="releaseTimestamp" value="${ems.timestamp}" />
    <property name="emsHome" value="${ems.home}" />
</bean>
  

Теперь в applicationContext-acegi.xml Я ссылаюсь на этот ems компонент:

 <bean id="authenticationManager" class="info.ems.config.ProviderManagerFactoryBean">
    <property name="emsImpl" ref="ems"/>        
    <property name="authenticationProvider" ref="authenticationProvider"/>
</bean>

<bean id="authenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="ems"/>
    <property name="passwordEncoder" ref="passwordEncoder"/>
</bean>        
  

И ProviderManagerFactoryBean.java:

 public class ProviderManagerFactoryBean implements FactoryBean {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    private EMSImpl emsImpl;
    private AuthenticationProvider authenticationProvider;

    public void setEmsImpl(EMSImpl emsImpl) {
        this.emsImpl = emsImpl;
    }

    public void setAuthenticationProvider(AuthenticationProvider authenticationProvider) {
        this.authenticationProvider = authenticationProvider;
    }

            //other code
}
  

Но я получаю эту ошибку:

 19:08:56,726 INFO  [STDOUT] 2011-05-30 19:08:56,724 [ScannerThread] ERROR [org.springframework.web.context.ContextLoader] - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationManager' defined in ServletContext resource [/WEB-INF/applicationContext-acegi.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy133] to required type [info.ems.EMSImpl] for property 'emsImpl'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy133] to required type [info.ems.EMSImpl] for property 'emsImpl': no matching editors or conversion strategy found
  

EMSImpl реализует EMS.

 @Service("emsImpl")
@Transactional(readOnly = true)
public class EMSImpl implements EMS {
     //other code
}

public interface EMS extends UserDetailsService {
     //other code
}
  

Как я могу это решить?

Спасибо и с уважением.

Комментарии:

1. Почему вы не ссылаетесь на свой объект через интерфейс EMS . Это то, что вы должны делать, насколько я знаю.

2. @Joachim Sauer вы предлагаете мне использовать EMS вместо EMSImpl в классе ProviderManagerFactoryBean?

Ответ №1:

Когда Spring создает транзакционный прокси-объект вокруг EMSImpl , это заставляет прокси-сервер реализовывать тот же набор интерфейсов в этом классе (т.Е. EMS ). Прокси, однако, не будет иметь тип EMSImpl .

В ProviderManagerFactoryBean вам нужно ввести тип type EMS , а не EMSImpl . Это также хороший дизайн — он отделяет ваши классы друг от друга, так что они взаимодействуют через интерфейсы.