当前位置: 首页 > 知识库问答 >
问题:

使用Spring Boot和display错误页处理MultipartException

齐磊
2023-03-14

我使用Spring Boot设置了一个非常简单的文件上传。我想知道是否有一种简单的方法可以在超过最大文件大小时显示错误页面。

我上传了一个非常简单的例子,说明我试图在github上实现的目标。

基本上,这个想法是在全局Spring异常处理程序中捕获MultipartException:

@ControllerAdvice
public class UploadExceptionHandler {

  @ExceptionHandler(MultipartException.class)
  public ModelAndView handleError(MultipartException exception) {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("error", exception.getMessage());
    modelAndView.setViewName("uploadPage");
    return modelAndView;
  }
}

处理文件上传的控制器非常简单:

@RequestMapping("/")
public String uploadPage() {
    return "uploadPage";
}

@RequestMapping(value = "/", method = RequestMethod.POST)
public String onUpload(@RequestParam MultipartFile file) {
    System.out.println(file.getOriginalFilename());
    return "uploadPage";
}

和上传页面。html thymeleaf模板也与之关联:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
    <title>Upload</title>
</head>
<body>

<div style="color: red" th:text="${error}" th:if="${error}">
    Error during upload
</div>

<form th:action="@{/}" method="post" enctype="multipart/form-data">
  <input type="file" id="file" name="file"/>
  <button type="submit" name="save">Submit</button>
</form>
</body>
</html>

这个想法是当文件太大时,在同一个上传页面中显示一条错误消息。

我的理解是,可以将Spring的MultipartResolver配置为惰性地解决异常,并能够在Spring级别(MVC异常处理程序)捕获这些异常,但这段代码似乎没有帮助:

@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
public StandardServletMultipartResolver multipartResolver() {
    StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
    multipartResolver.setResolveLazily(true);
    return multipartResolver;
}

所以在我采取像过滤器或扩展MultipartResolver这样的极端措施之前...

您知道用Spring MVC处理这些异常的干净方法吗?

感谢@rossen stoyanchev。下面是我最后做的:

@RequestMapping("uploadError")
public ModelAndView onUploadError(HttpServletRequest request) {
    ModelAndView modelAndView = new ModelAndView("uploadPage");
    modelAndView.addObject("error", request.getAttribute(WebUtils.ERROR_MESSAGE_ATTRIBUTE));
    return modelAndView;
}

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return container -> container.addErrorPages(new ErrorPage(MultipartException.class, "/uploadError"));
}

作品像一个魅力,感觉像一个优雅的解决方案。如果有人感兴趣,我在github上更新了项目。非常感谢!

共有1个答案

缑高朗
2023-03-14

多部分请求解析发生在选择处理程序之前,因此没有@控制器,因此还没有@控制器建议。您可以使用ErrorController(请参阅http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-功能错误处理)。

顺便说一句,您不需要@RequestParam。参数类型为MultipartFile就足够了。

 类似资料:
  • 通过对错误类型实现 Display 和 From,我们能够利用上绝大部分标准库错误处理工具。然而,我们遗漏了一个功能:轻松 Box 我们错误类型的能力。 标准库会自动通过 Form 将任意实现了 Error trait 的类型转换成 trait 对象 Box<Error> 的类型(原文:The std library automatically converts any type that imp

  • 本文向大家介绍SpringBoot 错误处理机制与自定义错误处理实现详解,包括了SpringBoot 错误处理机制与自定义错误处理实现详解的使用技巧和注意事项,需要的朋友参考一下 【1】SpringBoot的默认错误处理 ① 浏览器访问 请求头如下: ② 使用“PostMan”访问 请求头如下: 总结:如果是浏览器访问,则SpringBoot默认返回错误页面;如果是其他客户端访问,则默认返回JSO

  • 通过使用浏览器,当抛出错误时,我被正确地重定向到web.xml文件中指定的自定义错误页面 但是为什么我总是在curl的输出中看到默认的400错误页面及其跟踪?我缺少处理的异常类型(我使用的是java.lang.exception)或其他? 这是servlet的代码: 这是 web.xml 配置文件:

  • 我坚持使用这个简单的MVC示例。当我启动应用程序并转到localhost:8080时,我得到了“白标签错误页面”,甚至我在“src/main/资源/模板”中创建了“index.html”。我还在我的索引方法上添加了@Request estMap(“/”)。我找不到问题。 : : -在"src/main/资源/模板"下:

  • 您需要修复网页抛出的异常和在JavaScript中调试错误。 如果你能得到页面异常和JavaScript错误的细节,在实际工作中非常有用 。当页面抛出异常或脚本产生错误时,Console(控制台)面板会提供明确的可靠信息,以帮助您找到并解决问题。 在Console(控制台)面板中,您可以跟踪异常及跟踪导致异常的执行路径,显式地或隐式地捕获它们(或忽略它们),甚至可以设置错误处理程序来自动收集和处理

  • 我是Flink的新手,已经通过网站/示例/博客开始学习。我正在努力正确使用操作符。基本上我有两个问题 问题1:Flink是否支持声明性异常处理,我需要处理解析/验证/。。。错误? 我可以使用组织吗。阿帕奇。Flink。运行时。操作员。分类ExceptionHandler或类似的程序来处理错误 还是Rich/FlatMap功能是我的最佳选择?如果Rich/FlatMap是唯一的选项,那么是否有办法在