在简单的vertx路由器实现中获取空指针异常

时间:2019-03-18 17:42:43

标签: java vert.x

我学习了Java中的Vert.x框架。我正在尝试使用RouterVert.x web创建一个简单的API。下面是我的代码:

我的主班-MainVerticle.java(垂直):

public class MainVerticle extends AbstractVerticle{

    final int VA_PORT = 7535;

    @Override
    public void start() throws Exception {

        // URL routers
        IController controller = new RequestController();

        Router router = Router.router(vertx);

        router.post("/vassist").handler(
                routingContext -> controller.opController(routingContext) 
        );

        vertx.createHttpServer().requestHandler(router::accept).listen(VA_PORT, asyncResult -> {

            if(asyncResult.succeeded()) {
                LOGGER.info("Verticle deployed successfully. Listening on port: " + VA_PORT);
            }
            else {
                LOGGER.error("Could not start a HTTP server", asyncResult.cause());
            }

        });
    }

    @Override
    public void stop() throws Exception {
    }

    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();

        // Deploy main verticle
        vertx.deployVerticle(new MainVerticle());
    }

}

接口-IController.java

public interface IController {
    public void opController(RoutingContext routingContext);
}

RequestController.java实现上述接口:

public class RequestController implements IController {

    @Override
    public void opController(RoutingContext routingContext) {
        JsonObject jso = routingContext.getBodyAsJson();
        System.out.println("Received json body as : " + jso.encodePrettily());
    }

}

上面的代码成功地部署了verticle并创建了一个http服务器,但是,每当我发送带有示例json主体的HTTP POST时,在{{ 1}}。

我的HttpServer实现不正确吗?请注意,我不想将http请求处理程序写为System.out.println("Received json body as : " + jso.encodePrettily());的{​​{1}}方法内的匿名函数。

3 个答案:

答案 0 :(得分:2)

问题现在已解决。问题是我没有在opController方法中为接收到的请求实现bodyhandler。正确的实现如下:

public void opController(RoutingContext routingContext) {
        routingContext.request().bodyHandler(bodyHandler -> {
            JsonObject jso = bodyHandler.toJsonObject();
            System.out.println("Received json body as : " + jso.encodePrettily());
        });

        // Complete request
        routingContext.response().setStatusCode(200).end("Done!");
    }

答案 1 :(得分:0)

您可以通过定义一次一次 BodyHandler来简化操作,并将该主体作为缓冲区,字符串,json或json数组(例如,波纹管)获取:

public class HttpServer extends AbstractVerticle {

   @Override
   public void start(Future<Void> startFuture) {
      var router = Router.router(vertx);
      //notice here
      router.route().handler(BodyHandler.create());

      // a bonus :) 
      router.route().handler(LoggerHandler.create(LoggerFormat.DEFAULT));

      router.post("/api/books").handler(this::getAllBooks);

      vertx.createHttpServer()
            .requestHandler(router)
            .listen(config().getInteger("server.port", 9000), lh -> startFuture.complete());
   }


   private void getAllBooks(RoutingContext rc) {
      // do something with the body
      JsonObject jso = rc.getBodyAsJson(); // or String body = getBodyAsString();
      System.out.println("Received json body as : " + jso.encodePrettily());
      //respond
      rc.response().setStatusCode(HttpResponseStatus.OK.code()).end("Done!");
   }

}

答案 2 :(得分:0)

Vertx HttpServer 将捕获路由处理程序中发生的所有异常,然后返回状态代码 = 500(= 内部服务器错误)的 http 响应。所以http服务器不会因任何异常而停止。

使用“try catch”来捕获异常,例如:

String abc = null;
try {
    // add your code here
    abc.charAt(0);  
} catch (Exception e) {
    e.printStackTrace();
}

处理异常的其他方式:

router.route("/*").failureHandler(rc->{
    int statusCode = rc.statusCode();
    System.out.println("status code = " + statusCode );
    
    rc.response().setStatusCode(statusCode).end("failureHandler here");  
});