2013-12-12 109 views
1

任何人都知道如何向@ControllerAdvice注入依赖关系?@ControllerAdvice未注入@Autowired依赖关系

My @ControllerAdvice扩展Spring的ResponseEntityExceptionHandler并实现无接口。

@ControllerAdvice被调用正确,但@Autowired依赖从未被注入。没有启动注入错误,依赖关系是空的。

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

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

有没有一种方法可以指定Spring应该为这种特定情况使用JDK代理?

编辑:顺便说一句,我使用的是Spring 3.2.4.RELEASE。

Sample类:

@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代理仍然是一个不同的实例,哪些字段为空 - 它只是将调用委托给后面的bean,因为不能创建方法最后。 –

回答

1

在你的情况你的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。

+0

非常感谢,就是这样。我没有仔细阅读你的评论。 – pakman