2013-12-12 2 views
1

Кто-нибудь знает, как ввести зависимость в @ControllerAdvice?@ControllerAdvice с @Autowired зависимость не впрыскивается

My @ControllerAdvice расширяет Spring ResponseEntityExceptionHandler и не использует интерфейсы.

@ControllerAdvice вызывается правильно, но @Autowired зависимость никогда не вводится. Ошибок при загрузке нет, зависимость просто равна нулю.

Я предполагаю, что это связано с тем, как Spring проксирует @ControllerAdvice с cglib так, что @Autowired аннотация теряется.

Я протестировал реализацию интерфейса, так что Spring может создать прокси-сервер JDK, но он тоже не работает. Фактически с интерфейсом он даже не вызывался вообще ... даже если я также аннотирую интерфейс с @ControllerAdvice.

Есть ли способ указать, что Spring должен использовать прокси JDK для этого конкретного случая?

EDIT: Я использую Spring 3.2.4.RELEASE, кстати.

образца Класс:

@ControllerAdvice 
public class RestExceptionHandler extends ResponseEntityExceptionHandler { 

    @Autowired(required = true) 
    public AuditService auditService; 

    @ExceptionHandler(value = { RuntimeException.class }) 
    public final ResponseEntity<Object> handleRuntimeException(Exception ex, WebRequest request) { 
     // auditService is null here! 
    } 

} 
+0

Вы уверены, что это методы (где ссылка null) не 'final'? Вы уверены, что вы проверяете состояние правильного объекта в нужное время - прокси-сервер CGLIB по-прежнему является другим экземпляром, поля которого равны нулю, а просто делегирует вызовы компоненту позади, поскольку эти методы не могут быть выполнены окончательный. –

ответ

1

В вашем случае ваш боб находится за прокси CGLIB. Он создает подкласс вашего bean-компонента и как метод имеет final модификатор он не может изменить поведение исходного класса ResponseEntityExceptionHandler, чтобы вставить звонок в bean-back - проверьте my other answer about CGLIB.

Прокси-сервер CGLIB - это другой объект, который делегирует вызов метода исходному компоненту.

Обратите внимание, что невозможно реализовать большую часть функциональности Spring только при подклассов, то есть без этого разделения объектов. Как это работает, когда singleton-scoped bean ссылки a session-scoped bean - очевидно, существует много session-scope фасоль и только один singleton-scoped bean.

+0

Спасибо, что это было. Я недостаточно читал ваш комментарий. – pakman

Смежные вопросы