我使用spring注入DemoService一直为null,servlet的过滤器注入没有问题,在扩展TurboFilter的类中,如何获取DemoService对象?
https://stackoverflow.com/questions/30662641/inject-spring-bean-into-custom-logback-filter
我尝试了这种连接的答案,但没有解决注入问题。
public class ErrorLogTurboFilter extends TurboFilter {
@Autowired
private DemoService demoService;
@Override
public FilterReply decide(Marker marker, Logger logger, Level level, String s, Object[] objects, Throwable throwable) {
// todo
return FilterReply.NEUTRAL;
}
}
答案 0 :(得分:0)
问题:Logback在Spring上下文之前启动。因此,您需要使用要注入的bean延迟初始化Filter。除此之外,Filter不会被称为Spring bean,而会被称为Turbofilter,它不知道任何注入等等。
您可以尝试的是在您的上下文中将Filter定义为一个Spring bean,其中包含DemoService
。通过服务的Setter注入Bean,但声明字段 static ,这样您就可以从日志记录上下文中访问它。
现在在执行过程中,您需要检查静态字段是否已初始化,如果可以,则可以毫无问题地使用它。
答案 1 :(得分:0)
您没有尝试引用的答案,因为扩展过滤器“ ErrorLogTurboFilter”没有“ @Named(“ errorLogTurboFilter”)”,这是使过滤器成为弹跳豆的标准注释。
请参阅:What is javax.inject.Named annotation supposed to be used for?
答案 2 :(得分:0)
@markusw根据您的提示,这是我的解决方案,谢谢您。
@Configuration
public class WebConfig {
@Bean
public DemoService demoService() {
return new DemoService();
}
}
public class ErrorLogTurboFilter extends TurboFilter {
private ApplicationContext ctx = new AnnotationConfigApplicationContext(WebConfig.class);
private DemoService demoService = ctx.getBean(DemoService.class);
@Override
public FilterReply decide(Marker marker, Logger logger, Level level, String s, Object[] objects, Throwable throwable) {
// todo
return FilterReply.NEUTRAL;
}
}