@ControllerAdvice 与 @Autowired 依赖项未注入

pak*_*man 4 spring dependency-injection proxy-classes cglib

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

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

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

我想这与 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!
    }

}
Run Code Online (Sandbox Code Playgroud)

Bor*_*hov 6

在您的情况下,您的 bean 位于 CGLIB 代理后面。它创建了 bean 的子类,并且由于该方法具有final修饰符,因此它无法更改原始ResponseEntityExceptionHandler类的行为以在后面插入对 bean 的调用 - 请检查我关于 CGLIB 的其他答案

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

请注意,仅通过子类化(即没有这种对象分离)来实现 Spring 的大部分功能是不可能的。singleton-scoped当bean 引用一个bean时它会如何工作session-scoped- 显然有很多session-scopebean 而只有一个singleton-scopedbean。