如何从 micronaut 框架内的服务访问 ApplicationContext?

jmd*_*dev 1 java spring consul micronaut

我在服务中访问 ApplicationContext 的每一次尝试都失败了,ApplicationContext 被返回为 null。在 Spring 中,我能够使用 ApplicationContextAware,根据(https://micronaut-projects.github.io/micronaut-spring/latest/guide/index.html)应该在 micronaut 中用 @Autowired 替换。我已经尝试过

@Autowired ApplicationContext context
Run Code Online (Sandbox Code Playgroud)

然而没有运气。它始终为空。任何帮助,将不胜感激!

Jef*_*own 6

https://github.com/jeffbrown/injectcontext 上的项目展示了两种注入ApplicationContext.

https://github.com/jeffbrown/injectcontext/blob/1f319a3bb3db8eff05f159dd8dc642b227662307/src/main/java/injectcontext/FirstService.java

package injectcontext;

import io.micronaut.context.ApplicationContext;

import javax.inject.Singleton;

@Singleton
public class FirstService {

    private final ApplicationContext applicationContext;

    public FirstService(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    public boolean isContextNull() {
        return applicationContext == null;
    }
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/jeffbrown/injectcontext/blob/1f319a3bb3db8eff05f159dd8dc642b227662307/src/main/java/injectcontext/SecondService.java

package injectcontext;

import io.micronaut.context.ApplicationContext;

import javax.inject.Inject;
import javax.inject.Singleton;

@Singleton
public class SecondService {

    @Inject
    ApplicationContext applicationContext;

    public boolean isContextNull() {
        return applicationContext == null;
    }
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/jeffbrown/injectcontext/blob/1f319a3bb3db8eff05f159dd8dc642b227662307/src/main/java/injectcontext/DemoController.java

package injectcontext;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/")
public class DemoController {

    FirstService firstService;

    SecondService secondService;

    public DemoController(FirstService firstService, SecondService secondService) {
        this.firstService = firstService;
        this.secondService = secondService;
    }

    @Get("/first")
    public String first() {
        boolean isNull = firstService.isContextNull();

        return "firstService.isContextNull() == " + isNull;
    }

    @Get("/second")
    public String second() {
        boolean isNull = secondService.isContextNull();

        return "secondService.isContextNull() == " + isNull;
    }
}
Run Code Online (Sandbox Code Playgroud)

这一切都有效:

 $ curl http://localhost:8080/first
firstService.isContextNull() == false
 $ 
 $ curl http://localhost:8080/second
secondService.isContextNull() == false
Run Code Online (Sandbox Code Playgroud)

编辑

如果您真正想要的只是检索服务 ID,则可以执行以下操作:

package injectcontext;

import io.micronaut.discovery.DiscoveryClient;
import org.reactivestreams.Publisher;

import javax.inject.Singleton;
import java.util.List;

@Singleton
public class DiscoveryHelper {

    private final DiscoveryClient consulClient;

    public DiscoveryHelper(DiscoveryClient consulClient) {
        this.consulClient = consulClient;
    }

    public Publisher<List<String>> getIds() {
        // do whatever you want with the ids...
        return consulClient.getServiceIds();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您在启用了 consul 的服务中使用它,那将起作用。

consul:
  client:
    registration:
      enabled: false # set to true if you want this service to register itself
    defaultZone: "${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}"
Run Code Online (Sandbox Code Playgroud)