我正在尝试构建一个自定义错误 404 页面,在其上显示随机的 Chuck Norris 笑话,但即使输入错误的 URL 会显示错误页面,Thymeleaf 也不会呈现 Chuck Norris 笑话。我尝试通过将
root.get("value").asText()
替换为 "Hello World!"
作为 model.addAttribute
中的第二个参数来进行故障排除,以确保它正常工作,但它也没有呈现在页面上。即使尝试使用 error
调试 System.out.Println
方法也不起作用,因为每当向错误页面发出请求时,都不会向终端打印任何内容。为了以防万一,我在 server.error.whitelabel.enabled=false
中写了 application.properties
来摆脱 WhiteLabel 错误页面并显示我的自定义错误页面。
如何让错误页面从 API 接收数据并使用 Thymeleaf 显示它?我做错了什么我没有看到的事情吗?我对 SpringBoot 还很陌生。
ErrorController.java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.logging.Level;
import java.util.logging.Logger;
@RestController
public class ErrorController {
@GetMapping("/error")
public String error(Model model) {
try {
String url = "https://api.chucknorris.io/jokes/random?category=history";
RestTemplate restTemplate = new RestTemplate();
ObjectMapper mapper = new ObjectMapper();
String jsonListResponse = restTemplate.getForObject(url, String.class);
JsonNode root = mapper.readTree(jsonListResponse);
model.addAttribute("quote", root.get("value").asText());
return "error";
} catch (JsonProcessingException ex) {
Logger.getLogger(RestController.class.getName()).log(Level.SEVERE,
null, ex);
model.addAttribute("quote", "Chuck Norris broke the joke.");
return "error";
}
}
}
错误.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Error 404</title>
</head>
<body>
<h1 data-th-text="${quote}"></h1>
</body>
</html>
我简要查看了您的问题描述,注意到您想要返回 Thymeleaf 视图,但在您的代码中,您使用了 @RestController,它由 Spring 提供,用于返回 JSON 数据,而不是视图名称。 解决方案是将@RestController替换为@Controller。
@Controller
public class ErrorController {
@GetMapping("/error")
public String error(Model model) {
try {
String url = "https://api.chucknorris.io/jokes/random?category=history";
RestTemplate restTemplate = new RestTemplate();
ObjectMapper mapper = new ObjectMapper();
String jsonListResponse = restTemplate.getForObject(url, String.class);
JsonNode root = mapper.readTree(jsonListResponse);
model.addAttribute("quote", root.get("value").asText());
return "error";
} catch (JsonProcessingException ex) {
Logger.getLogger(RestController.class.getName()).log(Level.SEVERE,
null, ex);
model.addAttribute("quote", "Chuck Norris broke the joke.");
return "error";
}
}
}
第一次回答问题,希望对你有帮助。如有错误请见谅。