为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2022-08-17 16:50:07
我在Java中学习Vert.x框架。我正在尝试使用 和 创建一个简单的 API。以下是我的代码:RouterVert.x web我的主类 - (顶点):MainVerticle.javapublic 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.javapublic 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());    }}上面的代码成功部署了顶点并创建了一个http服务器,但是,每当我发送带有示例体的HTTP POST时,我都会在.jsonSystem.out.println("Received json body as : " + jso.encodePrettily());RequestController.java我的 HttpServer 实现不正确吗?请注意,我不想将 http 请求处理程序编写为 方法中的匿名函数。creatHttpServer()vertx
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

问题现已修复。问题是我没有在opController方法中为收到的请求提供身体处理程序。正确的实现如下:


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!");

    }


查看完整回答
反对 回复 2022-08-17
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

您可以通过定义一次BodyHandler来简化,并将body作为缓冲区,字符串,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!");

   }


}


查看完整回答
反对 回复 2022-08-17
?
动漫人物

TA贡献1815条经验 获得超10个赞

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");  

});


查看完整回答
反对 回复 2022-08-17
  • 3 回答
  • 0 关注
  • 196 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信