Vertx 实例变量在 Spring 上下文中为空

Vertx instance variable is null in Spring context

我定义了一个Spring Boot App作为Verticle如下:

@SpringBootApplication
public class SpringAppVerticle extends AbstractVerticle {


private Vertx myVertx;

@Override
public void start() {
    SpringApplication.run(SpringAppVerticle.class);
    System.out.println("SpringAppVerticle started!");
    this.myVertx = vertx;
}


@RestController
@RequestMapping(value = "/api/hello")
public class RequestController {

    @RequestMapping(method = RequestMethod.GET, produces = "application/json")
    public void getEcho() {
        JsonObject message = new JsonObject()
                .put("text", "Hello world!");
        myVertx.eventBus().send(EchoServiceVerticle.ADDRESS, message, reply -> {
            JsonObject replyBody = (JsonObject) reply.result().body();
            System.out.println(replyBody.encodePrettily());
        });
    }

}
}

我有第二个非Spring Verticle,它基本上是一个回显服务:

public class EchoServiceVerticle extends AbstractVerticle {

public static final String ADDRESS = "echo-service";

@Override
public void start() {
    System.out.println("EchoServiceVerticle started!");
    vertx.eventBus().consumer(EchoServiceVerticle.ADDRESS, message -> {
        System.out.println("message received");
        JsonObject messageBody = (JsonObject) message.body();
        messageBody.put("passedThrough", "echo-service");
        message.reply(messageBody);
    });
}

}

问题是我在 myVertx.eventbus() 行得到一个空指针。在 SpringAppVerticle class 中发送,因为 myVertx 变量为空。

如何在 Spring 上下文中正确实例化 Vertx 变量,以便我可以在两个 Verticle 之间交换消息?

我的项目可以在这里找到:https://github.com/r-winkler/vertx-spring

异常原因如下:

在 spring init 期间创建的 SpringAppVerticle bean 是启动 spring 启动应用程序的另一个对象。所以你有两个对象,一个调用了 start() 方法,另一个没有。第二个实际上处理请求。因此,您需要将 Verticle 注册为 spring beans。

有关 vertx/spring 互操作性的示例,请参阅 vertx examples repo

P.S。我已经为您的存储库创建了一个 pull request 以使您的示例工作。