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 以使您的示例工作。
我定义了一个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 以使您的示例工作。