2017-06-21 2 views
0

私は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つのコントローラーを他のすべてのコントローラーと比較し、同じパターンに従っているようです。

誰かが何か提案があれば、私は感謝以上のことでしょう。私は何が欠けているか分からないので、どんな提案も大歓迎です。

答えて

0

さてたら、それを確認したので、私は、私が行方不明になったものを考え出しました。 Springを初めて熟知しているので、パラメータの順序が重要であることはわかりませんでした。明らかに、BindingResultは、検証するパラメータの直後にある必要があります。だから、私は次のようにメソッドのシグネチャを変更し、現在すべての意図したとおりに機能さ:

public ModelAndView save(@Valid Item item, BindingResult result, @RequestParam(name = "itemImage", required = false) MultipartFile file, 
        RedirectAttributes redirect) { 
0

は、コントローラのメソッドでsigMultipartHttpServletRequest mrequestを追加し、

+0

あなたは私が私の現在のコントローラにMultipartHttpServletRequestを追加するか、このパラメータで新しいメソッドを作る示唆していますか?そのオブジェクトの中で何をチェックするのですか? – jdhurricanes

関連する問題