spring - @ControllerAdvice 与@Autowired 依赖关系未被注入(inject)

标签 spring dependency-injection proxy-classes cglib

有人知道如何将依赖项注入(inject) @ControllerAdvice 吗?

我的@ControllerAdvice 扩展了 Spring 的 ResponseEntityExceptionHandler 并且没有实现接口(interface)。

@ControllerAdvice 被正确调用,但永远不会注入(inject)@Autowired 依赖项。没有启动注入(inject)错误,依赖项只是空的。

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

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

有没有办法指定 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!
    }

}

最佳答案

在您的情况下,您的 bean 位于 CGLIB 代理之后。 它创建了您的 bean 的一个子类,并且由于该方法具有 final 修饰符,它无法更改原始 ResponseEntityExceptionHandler 类的行为来插入一个调用后面的 bean - 请检查 my other answer about CGLIB .

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

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

关于spring - @ControllerAdvice 与@Autowired 依赖关系未被注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20551343/

相关文章:

spring - 从 HTTPS 切换到 HTTP

c# - 具有多个项目的 ASP.NET MVC 架构中的依赖注入(inject)

java - @Cacheable 打破 DependencyInjection

java - 为没有无参数构造函数的类创建动态代理

grails - 在 quartz 作业中通过 setter/getter 暴露配置属性

java - 在运行时增强 java 对象

spring - Grails 2.3.x 中使用的是哪个版本的 Spring

java - 由 : java. lang.ClassCastException : $ProxyX cannot be cast to my. package.DefaultCustomerProviderImpl 引起

java - 如何使用 weblogic 和 JPA 在 Spring 中处理事务

C# 依赖注入(inject)副作用(两步初始化反模式)?