Spring上下文

时间:2017-02-03 10:46:19

标签: spring spring-boot vert.x

我将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

1 个答案:

答案 0 :(得分:2)

例外的原因如下:

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

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

P.S。我已经为您的回购邮件创建了pull request以使您的示例正常运行。