Как получить контекст приложения внутри метода аннотированного класса Spring RestController - PullRequest
0 голосов
/ 21 января 2020

У меня есть простое приложение, использующее @SpringBootAnnotation с одним вызовом по методу main :

SpringApplication.run(App.class, args);

В приложении. java Я также определяя пару @BeanS, которые дают экземпляр драйверов для доступа к внешним сервисам:

@Bean
public APEWebservice ape() {
  return new APEWebservice(apeWebAddress + ":" + apePort);
}

Затем, на методе одного из моих @RestControllerS, я хочу сделать доступ к этим bean-компонентам, так что я могу делать дальнейшие вызовы к этим другим службам, что-то вроде этого:

@PostMapping(path="/talk", consumes = "application/json")
@ResponseStatus(HttpStatus.ACCEPTED)
public Talk talk(@RequestBody InputTalk body) throws ConfigurationException {
  ApplicationContext context = new AnnotationConfigApplicationContext(App.class);
  APEWebservice ape = context.getBean("ape", APEWebservice.class);
  String DRSString = ape.getSoloOutput(input, OutputType.DRSXML);
  ((ConfigurableApplicationContext)context).close();
  try {
    Commanded transformed = Preprocessor.transform(body.getContent(), DRSString);
    return new Talk(counter.incrementAndGet(), transformed.execute());
  }
  catch (WrongCommandException e) {
      return new Talk(counter.incrementAndGet(), e.getError());
  }
}

Это выглядит очень уродливо, и я уверен, что я полностью упускаю точку Spring и внедрение зависимостей. Есть ли способ получить доступ к контексту без необходимости инициализировать его для каждого вызова API?

Я использую SpringBoot 2.2.1

1 Ответ

1 голос
/ 21 января 2020

А как насчет инъекций?

@Autowired
private final APEWebservice service;

//code
@PostMapping(path="/talk", consumes = "application/json")
@ResponseStatus(HttpStatus.ACCEPTED)
public Talk talk(@RequestBody InputTalk body) throws ConfigurationException {
String DRSString = service.getSoloOutput(input, OutputType.DRSXML);
...