ApplicationContextAware 在 spring-boot 中不起作用

问题描述 投票:0回答:2

我正在尝试在非组件类中使用 Brave Tracer。 该代码在主项目中运行良好,设置上下文和获取上下文都在打印。但是当我生成 jar 文件并将其导入到不同的项目 2 并运行它时,仅获取上下文正在打印并出现 null 错误。

我是 spring-boot 新手 最初的问题是我想将 Autowired Tracer 到我的非组件类,我用谷歌搜索它来解决这个问题,我在谷歌中得到了这个结果。如果有人对此类问题有任何其他解决方案。 欢迎提出建议

谢谢你。

    // Project 1
    // This is the main code, Generated a Jar file
   
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ApplicationContextUtils implements ApplicationContextAware {
    
        private static ApplicationContext ctx;
    
        @Override
        public void setApplicationContext(ApplicationContext appContext) {
            System.out.println("Setting context");
            ctx = appContext;
        }
    
        public static ApplicationContext getApplicationContext() {
           System.out.println("Getting context");
            return ctx;
        }
    }
 // Project 2
 // imported project 1 jar file to this project
 // Added jar file below main package
 // for simplicity i have used this in main class which is component class


 @SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    
        // using this lines in non-component class
    
        ApplicationContext contextUtils = ApplicationContextUtils.getApplicationContext();
        contextUtils.getApplicationName();
    }
}
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "org.springframework.context.ApplicationContext.getApplicationName()" because "contextUtils" is null
    at com.omniauth.omniauth.OmniAuthApplication.main(OmniAuthApplication.java:26)
java spring spring-boot applicationcontext zipkin
2个回答
0
投票

您得到

NullPointerException
是因为其他项目中的代码在加载
getApplicationContext
之前调用
ApplicationContextUtils

事实上,

ApplicationContextUtils
组件可能根本不会被加载,因为默认情况下,Spring Boot仅加载与主类(带有
@SpringBootApplication
注释的组件)位于同一包(或子包)中的组件。如果其他项目使用不同的包名称,则永远不会加载
ApplicationContextUtils


0
投票

由于你的属性

私有静态ApplicationContext ctx;

静态,您需要在集合中引用为

ApplicationContextUtils.ctx = appContext;

© www.soinside.com 2019 - 2024. All rights reserved.