春季注入logback TurboFilter

时间:2018-12-05 09:03:19

标签: spring logback

我使用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;
    }
}

3 个答案:

答案 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;
}

}