我将Spring Boot应用程序定义为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,它基本上是一个echo服务:
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()行获得了一个nullpointer。在SpringAppVerticle类中发送,因为myVertx变量为null。
如何在Spring上下文中正确实例化Vertx变量,以便我可以在两个Verticle之间交换消息?
我的项目可以在这里找到:https://github.com/r-winkler/vertx-spring
答案 0 :(得分:2)
例外的原因如下:
在spring init期间创建的SpringAppVerticle bean是启动spring boot应用程序的另一个对象。所以你有两个对象,一个调用了start()
方法,另一个没有调用。第二个实际上处理请求。所以你需要的是将Verticle注册为spring bean。
有关vertx / spring互操作性的示例,请参阅vertx examples repo。
P.S。我已经为您的回购邮件创建了pull request以使您的示例正常运行。