#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
. Это также хороший дизайн — он отделяет ваши классы друг от друга, так что они взаимодействуют через интерфейсы.