9

我想做一些事情来用 spark+java+hibernate+postgres 注册用户

这是我的代码:

post("/registrar", (request, response) -> {
        EntityManagerFactory emf = Persistence.
         createEntityManagerFactory("compradorcitoPU");
         EntityManager em = emf.createEntityManager();em.getTransaction().begin();
         em.persist(u);
         em.getTransaction().commit();
         em.close(); return null; });

但出现了这个错误:

信息 spark.webserver.MatcherFilter - 请求的路由 [/registrarnull] 尚未在 Spark 中映射

4

4 回答 4

10

我有一个类似的问题。我要返回的项目很大,我想把它们写出来。所以,我的软件看起来像这样:

    post("/apiserver", "application/json", (request, response) -> {
        log.info("Received request from " + request.raw().getRemoteAddr());
        ServerHandler handler = new ServerHandler();
        return handler.handleRequest(request, response);
    });

在我的处理程序中,我得到了原始的 HttpResponse 对象,打开了它的 OutputStream 并像这样写了它:

    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValue(response.raw().getOutputStream(), records);

因为我知道我已经在 OutputStream 上写了调用者当时要求的内容(或错误),所以我想我可以返回 null。我的程序运行良好。Spark 会按预期将请求路由到我的处理程序。而且,由于我正在编写原始的 OutputStream,因此我得到了客户端所期望的内容。但是,我一直在我的服务器日志中看到消息“/apiserver route not defined”。

在查看 Spark 文档时,它说:

Spark 应用程序的主要构建块是一组路由。一条路线由三个简单的部分组成:

动词(get、post、put、delete、head、trace、connect、options)

路径(/hello,/users/:name)

回调(请求、响应)-> { }

显然 Spark 不知道你在原始 HttpResponse 上写了什么,作为一个网络服务器,你应该向调用者提供一些响应。因此,如果您的响应为空,则您还没有满足提供回调的要求,并且即使 Spark 按预期运行,您也会收到没有找到映射的错误。只需返回一个响应(null 不是响应,“200 OK”是),错误就会消失。

[编辑] 拼写和语法。

于 2015-09-26T07:46:30.297 回答
6

不要“返回null”而是返回空字符串或其他东西

于 2015-09-23T16:03:33.270 回答
3

正如本期评论中所解释的,SparkJava 认为返回 null 表示该路由尚未映射,因此它会记录错误消息并以 404 状态回复响应。

为了避免这种行为,您必须返回一个字符串(可能为空)。错误消息将消失,并将回复以字符串为正文和 200 状态的响应。

于 2017-08-04T17:38:17.230 回答
2

就我而言,我必须执行选项请求以取悦预检 CORS 检查:

    options("/*", (request,response)->{
        String accessControlRequestHeaders = request.headers("Access-Control-Request-Headers");
        if (accessControlRequestHeaders != null) {
            response.header("Access-Control-Allow-Headers", accessControlRequestHeaders);
        }
        String accessControlRequestMethod = request.headers("Access-Control-Request-Method");
        if(accessControlRequestMethod != null){
            response.header("Access-Control-Allow-Methods", accessControlRequestMethod);
        }

        return "OK";
    });
于 2018-03-27T05:47:45.507 回答