【问题标题】:The requested route has not been mapped in Spark请求的路由尚未在 Spark 中映射
【发布时间】:2015-12-15 02:24:43
【问题描述】:

我想做一些用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; });

但是出现了这个错误:

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

【问题讨论】:

  • 我遇到了同样的(某种)错误,但我的是一个没有映射路线的 css 文件。我设法在这个答案的帮助下解决了这个错误。我希望它也能帮助你。 (设置 staticFileLocation 为我完成了这项工作)。 stackoverflow.com/a/28227521/4003055

标签: java hibernate postgresql persistence spark-java


【解决方案1】:

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

    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”是),错误就会消失。

[编辑]拼写和语法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      正如issue 的 cmets 中所解释的,SparkJava 认为返回 null 意味着路由尚未映射,因此它会记录错误消息并以 404 状态回复响应。

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

      【讨论】:

        【解决方案4】:

        在我的情况下,我必须执行选项请求来满足预检 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";
            });
        

        【讨论】:

        • 我要感谢自己在 5 个月后提醒我这个解决方案
        • 感谢您在七个月后提醒您使用此解决方案。每次使用 Spark Java 时,这个问题都会困扰我。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        相关资源
        最近更新 更多