如何从主应用程序调用服务调用Spring Boot?

时间:2018-04-06 18:26:12

标签: java spring spring-boot

我正在构建一个将从命令行调用的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)

4 个答案:

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

干杯。

相关问题