spring - Spring MultipartFile导致表单验证未映射

标签 spring spring-mvc gradle spring-boot thymeleaf

首先,我对Spring的了解非常有限。但是,我已经能够解决过去遇到的问题。我最新的问题对我来说意义不大。
因此,我所拥有的是一种表格,其中包含要在拍卖中出售的商品的属性。该表格有一个可选字段,可以上传正在出售的商品的图片。图像上传按原样进行。我注意到我的表单实际上没有显示验证期间给出的错误,因此我开始研究可能是什么原因造成的。如果我从方法签名中删除MultipartFile,则网络将正确显示表单验证错误(如果存在)。但是,现在我没有所需的图像。
另一方面,如果我在MultipartFile上的RequestParam中添加了required = false属性,则问题仍然存在,并且当表单不符合验证集时,就会遇到following
该方法的Java端,应在有效时保存该项目或显示验证错误,如下所示:

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView save(@Valid Item item, @RequestParam(name = "itemImage", required = false) MultipartFile file,
                         BindingResult result, RedirectAttributes redirect) {
    if (result.hasErrors()) {
        return new ModelAndView("item/save", "formErrors", result.getAllErrors());
    }

    boolean isCreate = (null == item.getId());

    if (file != null && !file.isEmpty()) {
        if (isCreate) {
            item = itemService.save(item);
        }

        Path directory = Paths.get(itemImageDir + "/" + item.getAuction().getId() + "/" + item.getId());

        if (!Files.exists(directory)) {
            try {
                Files.createDirectories(directory);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        try {
            Files.copy(file.getInputStream(), Paths.get(directory.toString(), file.getOriginalFilename()),
                    StandardCopyOption.REPLACE_EXISTING);
            item.setImageUrl(String.format("/items/image/%s/%s/%s", item.getAuction().getId(), item.getId(), file
                    .getOriginalFilename()));
            itemService.save(item);
        } catch (IOException | RuntimeException e) {
            result.addError(new ObjectError("imageUrl", "Failed to upload " + file.getOriginalFilename() + " => "
                    + e.getMessage()));
            return new ModelAndView("item/save", "formErrors", result.getAllErrors());
        }
    } else {
        itemService.save(item);
    }

    String message = "Successfully created a new item.";
    if (!isCreate)
        message = "Item has been successfully updated.";

    redirect.addFlashAttribute("globalMessage", message);
    return new ModelAndView("redirect:/auctions/{item.auction.id}", "item.auction.id", item.getAuction().getId());
}
此页面的 View 没有所有多余的内容,看起来像这样:
<form id="auctionForm" class="col-xs-12" th:action="@{/items/(item)}" th:object="${item}"
      action="#" method="post" enctype="multipart/form-data">
    <div th:class="'form-group row'">
        <label for="itemImage" class="control-label col-sm-2"> Image Upload: </label>
        <div class="col-sm-4">
            <input id="itemImage" type="file" name="itemImage"/>
        </div>
    </div>
</form>
问题的额外上下文:如果我删除@Valid批注,则该方法将被调用,并且在表单无效时不会失败。但是,当我有@Valid时, Controller 方法甚至都没有命中。如果没有到达 Controller ,有什么方法可以检查它在哪里出故障?我将此 Controller 与所有其他 Controller 进行了比较,它似乎遵循相同的模式。
如果有人有任何建议,我将不胜感激。我真的不知道我缺少什么,因此欢迎提出任何建议。

最佳答案

添加 Controller 方法sigMultipartHttpServletRequest mrequest并检查一次

关于spring - Spring MultipartFile导致表单验证未映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44684454/

相关文章:

java - Spring 中是否有等效于 CDI 的 @Default 限定符?

java - Spring Cron Job 什么时候会第一次执行?

java - 如何制作包含 Spring Bean 的 jar,并在 SpringBoot 应用程序中使用它?

android - Gradle + Robolectric : Where do I put the file org. robolectric.Config.properties?

java - Tomcat 6.0.35 和 Java 8

Css 和 js 未在 spring mvc 应用程序中加载

java - 为什么在我的 JBoss Tomcat 7 + Spring MVC 项目中出现 HTTP Status 404?

java - 我应该关闭我的 Spring 3 Controller 的 Writer 参数吗?

git - 从Bamboo中单独的GIT存储库中提取文件

android - 尝试在 Android 上运行我的 React Native 应用程序时出错