gpt4 book ai didi

java - Tomcat:ExceptionHasndler 不适用于 MultiPartException 但适用于 IllegalArgumentException

转载 作者:行者123 更新时间:2023-11-28 23:17:42 24 4
gpt4 key购买 nike

我有这样的 Controller :

@PostMapping("/rest_upload1")
public ResponseEntity upload1(@RequestParam("file") MultipartFile multipartFile) throws IOException {
throw new IllegalArgumentException();
}

在配置中我有设置:

spring.http.multipart.max-file-size=100MB
spring.http.multipart.max-request-size=100MB

这意味着如果文件超过 100MB,spring 将抛出 MultipartException

为了处理这个异常,我编写了处理程序:

@ControllerAdvice
public class RestExceptionHandlerAdvice extends ResponseEntityExceptionHandler {

@ExceptionHandler(MultipartException.class)
@ResponseBody
public ResponseEntity<ApiError> handleException(MultipartException e) {
logger.warn("MultipartException:", e);
ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST,
String.valueOf(HttpStatus.BAD_REQUEST),
ExceptionUtils.getRootCauseMessage(e),
Collections.emptyList());
return new ResponseEntity<ApiError>(apiError, HttpStatus.BAD_REQUEST);
}

如果出现错误,此代码将调用(我在调试中看到它)

但在浏览器中我没有看到响应:

enter image description here

enter image description here

我在谷歌上搜索了很多时间,看起来一切正常。我尝试为 IllegalArgumentException 添加处理程序:

@ExceptionHandler(IllegalArgumentException.class)
@ResponseBody
public ResponseEntity<ApiError> handleException(IllegalArgumentException e) {

ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST,
String.valueOf(HttpStatus.BAD_REQUEST),
ExceptionUtils.getRootCauseMessage(e),
Collections.emptyList());

return new ResponseEntity<ApiError>(apiError, HttpStatus.BAD_REQUEST);
}

我上传的文件小于 100mb。在这种情况下,结果不同:

enter image description here

但无论如何响应代码是错误的。

有什么问题吗?

附言

我试过:

@ExceptionHandler(MultipartException.class)
@ResponseStatus(value = HttpStatus.PAYLOAD_TOO_LARGE)
@ResponseBody
public String handleException(MultipartException e) {
return ExceptionUtils.getRootCauseMessage(e);
}

看起来和这里一样:

How to handle maximum file size Exception in Spring Boot?

附言2

我找到了解决方法,但它看起来像是 sring 中的错误:

我添加了依赖:

compile "org.apache.commons:commons-io:1.3.2"
compile "commons-fileupload:commons-fileupload:1.3.3"

注册bean:

@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(10);
return multipartResolver;
}

并写道:

@ControllerAdvice
public class UploadExceptionHandler {
@ExceptionHandler(MaxUploadSizeExceededException.class)
@ResponseStatus(HttpStatus.PAYLOAD_TOO_LARGE)
@ResponseBody
public String handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
return e.getMessage();
}
}

最佳答案

不是很聪明的 tomcat 开发人员添加了我们需要禁用/覆盖的新功能。

添加后就可以了:

    @Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {

TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();

tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {

// connector other settings...

// configure maxSwallowSize
if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
// -1 means unlimited, accept bytes
((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
}

});

return tomcat;

}

关于java - Tomcat:ExceptionHasndler 不适用于 MultiPartException 但适用于 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47396772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com