如何获取 API 并将其显示在自定义错误 404 页面上?

问题描述 投票:0回答:1

我正在尝试构建一个自定义错误 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>
spring-boot thymeleaf
1个回答
0
投票

我简要查看了您的问题描述,注意到您想要返回 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";
        }
    }
}

第一次回答问题,希望对你有帮助。如有错误请见谅。

© www.soinside.com 2019 - 2024. All rights reserved.