Ошибка Spring: BeanNotOfRequiredTypeException - PullRequest
4 голосов
/ 05 июля 2011

Мой контроллер содержит следующую аннотацию:

@Resource(name="userService")
private UserDetailsServiceImpl userService;

, а сама служба имеет следующее:

@Service("userService")
@Transactional
public class UserDetailsServiceImpl implements UserDetailsService {

    @Resource(name = "sessionFactory")
    private SessionFactory sessionFactory;

Однако при запуске появляется следующая ошибка:

Ошибка внедрения зависимостей ресурса;Вложенное исключение - org.springframework.beans.factory.BeanNotOfRequiredTypeException: bean-объект с именем 'userDetailsServiceImpl' должен иметь тип [myapp.service.UserDetailsServiceImpl], но на самом деле он имеет тип [$ Proxy19]

Ответы [ 2 ]

8 голосов
/ 05 июля 2011

должно быть

@Resource(name="userService")
private UserDetailsService userService;

Spring использует тип интерфейса для внедрения зависимостей, а не тип реализации

4 голосов
/ 05 июля 2011

Изменить на (интерфейс вместо конкретного класса):

@Resource(name="userService")
private UserDetailsService userService;

И жить долго и счастливо.

Длинная версия: во время выполнения по умолчанию Spring заменяет ваш класс на нечто , которое реализует все интерфейсы вашего класса.Если вы вводите интерфейс, а не конкретный тип, вам все равно, какой именно тип реализует этот интерфейс.

В вашем случае добавление аннотации @Transactional приводит к замене вашего компонента на прокси-сервер AOP с возможностями транзакций,Если вы удалите эту аннотацию, ваш код будет работать нормально.Однако полезно полагаться на интерфейсы, а не на конкретные реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...