@ControllerAdvice没有注入@Autowired依赖

时间:2013-12-12 18:28:22

标签: spring dependency-injection proxy-classes cglib

任何人都知道如何将依赖注入@ControllerAdvice?

我的@ControllerAdvice扩展了Spring的ResponseEntityExceptionHandler并且没有实现任何接口。

正确调用@ControllerAdvice,但永远不会注入@Autowired依赖项。没有启动注入错误,依赖性只是null。

我想这与Spring如何使用cglib代理@ControllerAdvice以便@Autowired注释丢失有关。

我通过实现一个接口进行测试,以便Spring可以创建一个JDK代理,但它也不起作用。实际上有一个接口,它甚至根本没有被调用...即使我也用@ControllerAdvice注释接口。

有没有办法指定Spring应该为特定情况使用JDK代理?

编辑:顺便说一句,我正在使用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!
    }

}

1 个答案:

答案 0 :(得分:2)

在您的情况下,您的bean位于CGLIB代理后面。 它创建了bean的子类,并且方法具有final修饰符它不能改变原始ResponseEntityExceptionHandler类的行为以插入对bean的调用 - 请查看my other answer about CGLIB

CGLIB代理是一个不同的对象,它将方法调用委托给原始bean。

请注意,只有子类化即没有对象分离,才能实现Spring的大部分功能。当singleton-scoped bean引用session-scoped bean时,它将如何工作 - 显然有很多session-scope bean和只有一个singleton-scoped bean。