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-SNAPSHOT-jar-with-dependencies.jar!/public/index.html
),没有有效的东西路径.
当 Paths.get()
尝试解析此路径时失败并抛出一个 NoSuchFileException
(这是一个 IOException
)。然后,您在 catch
块中 捕获 它,并且 return 为 null。 returning 的 null 是错误的,这就是您收到错误 404 的原因。
所以你需要:
- 更改项目结构,使
index.html
的路径正确。那么你就可以避免这种情况下的问题了。
- 正确处理异常,意味着 - 不要 return null。决定在这些情况下要做什么,然后,如果需要,您仍然可以向客户端提供正常的错误消息 and/or 使用
request.status()
API 或任何 any other response APIs自己设置回复状态。
我正在尝试在服务器端使用 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-SNAPSHOT-jar-with-dependencies.jar!/public/index.html
),没有有效的东西路径.
当 Paths.get()
尝试解析此路径时失败并抛出一个 NoSuchFileException
(这是一个 IOException
)。然后,您在 catch
块中 捕获 它,并且 return 为 null。 returning 的 null 是错误的,这就是您收到错误 404 的原因。
所以你需要:
- 更改项目结构,使
index.html
的路径正确。那么你就可以避免这种情况下的问题了。 - 正确处理异常,意味着 - 不要 return null。决定在这些情况下要做什么,然后,如果需要,您仍然可以向客户端提供正常的错误消息 and/or 使用
request.status()
API 或任何 any other response APIs自己设置回复状态。