不会注入具有@Autowired依赖项的@ControllerAdvice

编程入门 行业动态 更新时间:2024-10-25 17:17:14
本文介绍了不会注入具有@Autowired依赖项的@ControllerAdvice的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

Anyone knows how to inject a dependency to a @ControllerAdvice?

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

My @ControllerAdvice extends Spring's ResponseEntityExceptionHandler and implements no interfaces.

已正确调用@ControllerAdvice,但从未注入@Autowired依赖项。

The @ControllerAdvice gets called correctly, but the @Autowired dependency is never injected. There are no startup injection errors, the dependency is simply null.

我想这与Spring如何使用cglib代理@ControllerAdvice有关,以便获得@Autowired批注

I guess it has to do with how Spring proxies the @ControllerAdvice with cglib so that the @Autowired annotation gets lost.

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

I tested by implementing an interface, so that Spring could create a JDK proxy but it didn't work either. Actually with an interface, it didn't even gets called at all... even if I also annotate the interface with @ControllerAdvice.

有没有一种方法可以指定该接口对于这种特殊情况,Spring应该使用JDK代理吗?

Is there a way to specify that Spring should use JDK proxies for that particular case?

编辑:顺便说一下,我正在使用Spring 3.2.4.RELEASE。

I'm using Spring 3.2.4.RELEASE, by the way.

示例类:

@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的调用-请检查关于CGLIB的其他答案。

In your case your bean is behind a CGLIB proxy. It creates a subclass of your bean and as the method has final modifier it can't change the behavior of the original ResponseEntityExceptionHandler class to insert a call to the bean behind - please check my other answer about CGLIB.

CGLIB代理是另一个将方法调用委派给原始bean的对象。

CGLIB proxy is a different object that delegates the method calls to the original bean.

请注意,仅通过子类(即没有对象的分离)就不可能实现大部分Spring功能。当单个作用域 bean引用一个会话作用域 bean时,它将如何工作-显然有许多 session-scope bean和仅一个 Singleton-scoped bean。

Please note that it would not be possible to implement much of Spring functionality only with subclassing i.e. without this separation of objects. How would it work when singleton-scoped bean references a session-scoped bean - obviously there are many session-scope beans and only one singleton-scoped bean.

更多推荐

不会注入具有@Autowired依赖项的@ControllerAdvice

本文发布于:2023-08-02 11:48:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1277557.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Autowired   ControllerAdvice

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!