gpt4 book ai didi

java - Spring异常处理程序,无法访问请求属性

转载 作者:行者123 更新时间:2023-12-02 01:33:49 26 4
gpt4 key购买 nike

我有这个使用 spring boot 2.1 的 Controller

@Controller
@AllArgsConstructor
@ControllerAdvice
public class AdminPoolsController {

@PostMapping("admin/pools/edit")
public String update(@Valid final PoolDto pool,
@RequestParam(name = "image-upload", required = false) final MultipartFile file,
final BindingResult bindingResult,
final RedirectAttributes redirectAttrs) throws IOException {
//some logic
}


@ExceptionHandler(MaxUploadSizeExceededException.class)
public String fileSizeLimitExc(
final HttpServletRequest request,
final RedirectAttributes redirectAttributes,
final MaxUploadSizeExceededException exc
) {
final Object id = request.getAttribute("id");
redirectAttributes.addFlashAttribute(
"errors",
ImmutableMap.of(
"logo",
String.format(
"File exceeded max size of %d bytes",
exc.getMaxUploadSize()
)
)
);
return "redirect:/admin/pools/edit" + (id == null ? "" : "?id=" + id.toString());
}

}

正如你所见,我在 POST 方法中有 PoolDto,这个 DTO 有 id,通过 html 表单进行绑定(bind)

<input type="hidden" name="id" id="id" th:value="${pool.id}">

以 html 形式,我可以使用输入类型 file 提供文件,但该文件的大小有限,因此我捕获 MaxUploadSizeExceededException我的问题是,HttpServletRequest内部错误处理方法没有任何请求属性,在我的例子中,我想从原始请求中获取id,但它始终为空。如何使用 ExceptionHandler 捕获原始请求属性?

最佳答案

如果请求达到最大上传大小,则请求正文永远不会被完全处理。相反,当达到限制时,它会被取消。因此,请求体中传输的数据不可用。这与 Spring Boot 无关。这是一个更根本的限制。

要传递一些 ID,您基本上有三种选择:

  1. 将 ID 放入 URL,例如admin/pool/edit/123admin/pool/edit?id=123

  2. 将 ID 存储在 Cookie 中。

  3. 将 ID 存储在 session 中。 session ID 通过 cookie 保留。

关于java - Spring异常处理程序,无法访问请求属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55528745/

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