spring-mvc - 处理 org.thymeleaf.exceptions.TemplateI

我有以下 Controller 逻辑。但是,如果我导航到一个不存在的页面(例如/random-page),我最终会遇到 TemplateInputException。我怎样才能捕获这个并转到 404 页面?

@RequestMapping(value = { "{path:(?!resources|error).*$}", "{path:(?!resources|error).*$}/**" }, headers = "Accept=text/html")
public String index(final HttpServletRequest request) {
    try {
        String path = (String) request.getAttribute(
                HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
        return path.split("/")[1];
    } catch (Exception e) {
        log.error("Failed to render the page. {}",e);
        return "error/general";
    }
}

Thymeleaf 似乎忽略了 ExceptionHandler:
@ExceptionHandler(Exception.class)
public ModelAndView handleAllException(Exception ex) {

    ModelAndView model = new ModelAndView("error/generic_error");
    model.addObject("errMsg", "this is Exception.class");

    return model;

}

最佳答案

我的 spring-boot 解决这个问题的方法(exception is view with message param):

@Controller
public class ErrorController implements org.springframework.boot.autoconfigure.web.ErrorController {
    private static final String ERROR_PATH = "/error";

    @Autowired
    private ErrorAttributes errorAttributes;

    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }

    @RequestMapping(ERROR_PATH)
    public String error(HttpServletRequest request, Model model) {
        Map<String, Object> errorMap = errorAttributes.getErrorAttributes(new ServletRequestAttributes(request), false);
        String exception = (String) errorMap.get("exception");
        if (exception != null && exception.contains("TemplateInputException")) {
            errorMap.put("message", "Неверный запрос");
        }
        model.addAllAttributes(errorMap);
        return "exception";
    }
}

关于spring-mvc - 处理 org.thymeleaf.exceptions.TemplateInputException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41424130/

相关文章:

datetime - 如何在Lua中的给定日期时间添加天数

css - 由于非整数宽度,媒体查询运行异常

python-3.x - 模块 'urllib' 没有属性 'request'

c - 这个函数被认为是可重入的吗?

pointers - SGX - 受信任的网桥和受信任的代理有什么区别?

sandbox - 转移 Mac App Store 应用程序

macos - 如何使用 xhyve 从主机中删除 Minikube 主机路径目录?

visual-studio - 如何在 Visual Studio 2015(对于 C++)中仅禁用

scala - 为什么 Scala 没有为每个 monad 定义返回/单元函数(与 Haskell

haskell - Machines 和 Conduits(或其他类似库)之间的概念区别是什么?