gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:37:42 25 4
gpt4 key购买 nike

有人知道如何将依赖项注入(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com