任何人都知道如何将依赖注入@ControllerAdvice?
我的@ControllerAdvice扩展了Spring的ResponseEntityExceptionHandler并且没有实现任何接口。
正确调用@ControllerAdvice,但永远不会注入@Autowired依赖项。没有启动注入错误,依赖性只是null。
我想这与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!
}
}
答案 0 :(得分:2)
在您的情况下,您的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。