Java、火花、return index.html

Java, Spark, return index.html

我正在尝试在服务器端使用 Spark 创建 SPA。 这是我的 App.java:

package com.farot;
import java.util.HashMap;
import java.util.UUID;
import java.net.URL;
import java.net.URISyntaxException;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.nio.charset.Charset;
import java.io.IOException;

import com.google.gson.Gson;

import static spark.Spark.*;

import com.farot.utils.Path;

import com.farot.controllers.UserController;
import com.farot.controllers.AccountController;
import com.farot.controllers.MapController;

public class App 
{
  private static Gson gson = new Gson();

  private static String renderIndex() {
    try {
      URL url = App.class.getResource("index.html");
      return new String(Files.readAllBytes(Paths.get(url.toURI())), Charset.defaultCharset());
    } catch (IOException | URISyntaxException e) {
      System.out.println(e.getMessage());
    }
    return null;
  }

  public static void main( String[] args )
  {
    staticFiles.location("/public");

    before((req, res) -> {
      String path = req.pathInfo();
      if (path.endsWith("/"))
        res.redirect(path.substring(0, path.length() - 1));
    });

    // Site pages
    get("/", "text/html", (req, res) -> renderIndex());
    get("/login", "text/html", (req, res) -> renderIndex());

    post(Path.Web.api.Account.DEFAULT, (req, res) -> { 
      return AccountController.create(req, res); 
    }, gson::toJson);

  }

}

POST 在 Path.Web.api.Account.DEFAULT 的请求按预期工作,但在 /login returns 请求 404。可能有什么问题? index.html的路径是/resources/public/index.html.

在renderIndex()方法中,访问路径如下:

URL url = App.class.getResource("/public/index.html");

问题出在函数 renderIndex() 中。使用正确的资源路径(即 /public/index.html)后,变量 url 不再为 null,但根据您在评论中所说的,它有点奇怪(jar:file:/home/gorrtack/workspace/Farot/target/Farot-1.0-SNA‌PSHOT-jar-with-depen‌​dencies.jar!/public/‌​index.html),没有有效的东西路径.

Paths.get() 尝试解析此路径时失败并抛出一个 NoSuchFileException(这是一个 IOException)。然后,您在 catch 块中 捕获 它,并且 return 为 null。 returning 的 null 是错误的,这就是您收到错误 404 的原因。

所以你需要:

  1. 更改项目结构,使 index.html 的路径正确。那么你就可以避免这种情况下的问题了。
  2. 正确处理异常,意味着 - 不要 return null。决定在这些情况下要做什么,然后,如果需要,您仍然可以向客户端提供正常的错误消息 and/or 使用 request.status() API 或任何 any other response APIs自己设置回复状态。