我正在构建一个将从命令行调用的Spring Boot应用程序。 我将向应用程序传递一些参数,但是我从这个类调用服务时遇到了问题:
@SpringBootApplication
public class App{
public static void main(String[] args) {
SpringApplication.run(App.class, args);
App app = new App();
app.myMethod();
}
@Autowired
private MyService myService;
private void myMethod(){
myService.save();
}
}
我试图从主要内部调用方法,但我收到了错误:
Exception in thread "main" java.lang.NullPointerException
at com.ef.Parser.App.myMethod(Application.java:26)
at com.ef.Parser.App.main(Application.java:18)
答案 0 :(得分:6)
您可以创建一个实现CommandLineRunner的类,这将在应用启动后调用
@Component
public class CommandLineAppStartupRunner implements CommandLineRunner {
@Autowired
private MyService myService;
@Override
public void run(String...args) throws Exception {
myService.save();
}
}
您可以获得有关此here
的更多信息答案 1 :(得分:5)
在SpringBoot 2.x中,您可以简单地通过'--proxy-bypass-list=*',
'--proxy-server=\'http://<my org proxy server>:8080\''
方法运行该应用程序,然后对返回的ApplicationContext进行操作。下面是完整的示例:
SpringApplication.run
答案 2 :(得分:2)
通过自己使用new
关键字来创建App
类的实例,Spring无法知道它。
它也是多余的,因为Spring通过一种称为组件扫描的机制自动创建该类的bean实例。
我喜欢CommandLineRunner
的解决方案。
您还可以做的是检索ApplicationContext
,查找bean然后调用该方法。
您可以通过让ApplicationContext
类实现App
来注入ApplicationContextAware
,覆盖setter方法并将上下文保存在可以从main方法访问的静态变量中。 / p>
然后,您可以使用它来检索正确的App
实例。
App myApp = (App) applicationContext.getBean(App.class);
myApp.myMethod()
请注意,直接访问ApplicationContext
会违反整个依赖注入原则,但有时您没有太多选择。
答案 3 :(得分:0)
您的代码的问题是您没有查找您正在使用的服务的 applicationContext bean。我有一个类似的用例,在应用程序启动时调用功能服务。为服务初始化多个 applicationContext bean,然后使调用的方法工作正常!下面的代码:
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(UamRbacApplication.class, args);
AccessChangeSchedulerService accessChangeSchedulerService = applicationContext.getBean(AccessChangeSchedulerService.class);
AppContext appContext = applicationContext.getBean(AppContext.class);
try {
accessChangeSchedulerService.fetchAccessLevelChanges("EP", appContext.getSplunkToken());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
干杯。