私はSpringの知識が非常に限られていると言って始めます。しかし、私は過去に直面していた問題を解決することができました。私の最新の問題は、私にとってはあまり意味がありません。フォームの検証がマップされないようにするSpring MultipartFile
私が持っているものは、オークションで売るアイテムの属性を取るフォームです。このフォームには、販売されている商品の写真をアップロードできるオプションのフィールドがあります。画像アップロードはそのまま動作します。私は自分のフォームが実際に検証中に与えられたエラーを表示していないことに気付いたので、私はそれを引き起こしている可能性を調べ始めました。メソッドのシグネチャからMultipartFileを削除すると、フォーム検証エラーが存在する場合、Webに正しく表示されます。しかし、今私は必要なイメージを持っていません。
私が必要な= false属性をMultipartFileのRequestParamに追加すると、問題は解決せず、フォームが検証セットを満たさない場合、私は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());
}
このページのビュー、余分な綿毛のすべてがなく、ように見えますそう:問題の
<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を持っている場合、コントローラメソッドはヒットしません。それがコントローラに到達していない場合、どこが失敗しているかを確認する方法はありますか?私はこの1つのコントローラーを他のすべてのコントローラーと比較し、同じパターンに従っているようです。
誰かが何か提案があれば、私は感謝以上のことでしょう。私は何が欠けているか分からないので、どんな提案も大歓迎です。
あなたは私が私の現在のコントローラにMultipartHttpServletRequestを追加するか、このパラメータで新しいメソッドを作る示唆していますか?そのオブジェクトの中で何をチェックするのですか? – jdhurricanes