我正在尝试在非组件类中使用 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)
您得到
NullPointerException
是因为其他项目中的代码在加载 getApplicationContext
之前调用 ApplicationContextUtils
。
事实上,
ApplicationContextUtils
组件可能根本不会被加载,因为默认情况下,Spring Boot仅加载与主类(带有@SpringBootApplication
注释的组件)位于同一包(或子包)中的组件。如果其他项目使用不同的包名称,则永远不会加载 ApplicationContextUtils
。
由于你的属性
私有静态ApplicationContext ctx;
是静态,您需要在集合中引用为
ApplicationContextUtils.ctx = appContext;