2016-09-28 7 views
0

私はSpring/Thymeleafを学んでおり、私は小さなプロジェクトを構築しています。 ここに私のコードの一部です:これは私の編集者であるInitBinderはサブミット時に呼び出しません

@Controller 
public class MovieController { 

    private IMovieService movieService; 
    private IGenreService genreService; 

    @Autowired 
    public MovieController(IMovieService movieService, IGenreService genreService) { 

     this.movieService = movieService; 
     this.genreService = genreService; 
    } 

    @InitBinder(value = "genres") 
    protected void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(Genre.class, new GenrePropertyEditor()); 
    } 


    @RequestMapping(value = "/addNewMovie", method = RequestMethod.GET) 
    public String addMovieForm(Model model) { 
     model.addAttribute("movie", new Movie()); 
     model.addAttribute("genreList", genreService.findAll()); 

     return "movie-add/view"; 
    } 

    @RequestMapping(value = "/addNewMovie", method = RequestMethod.POST) 
    public String addMovie(@ModelAttribute Movie movie, Model model) { 
     movieService.save(movie); 

     return "redirect:allMovies"; 
    } 
} 

: これは私のコントローラである

public class GenrePropertyEditor extends PropertyEditorSupport { 

    @Autowired 
    private GenreService genreService; 

    @Override 
    public void setAsText(String id) { 
     final Genre part = genreService.findById(UUID.fromString(id)); 
     setValue(part); 
    } 

    @Override 
    public String getAsText() { 
     return ((Genre) getValue()).getId().toString(); 
    } 
} 

そして、これが私の見解です:私は呼ん

<form action="#" th:action="@{/addNewMovie}" th:object="${movie}" 
     method="post"> 
     <p> 
      Title : <input type="text" th:field="*{title}" /> 
     </p> 
     <p> 
      Description : <input type="text" th:field="*{description}" /> 
     </p> 
     <p> 
      Year : <input type="text" th:field="*{year}" /> 
     </p> 

     <select class="form-control" th:field="*{genres}" multiple="multiple"> 
      <option th:each="genre : ${genreList}" 
       th:field="*{genres}" 
       th:value="${genre.id}" 
       th:text="${genre.genreInformation}"> 
       Action 
      </option> 
     </select> 

     <p> 
      <input type="submit" value="Submit" /> <input type="reset" 
       value="Reset" /> 
     </p> 

    </form> 

addMovieメソッドを使用して新しいムービーを作成します。タイトル、説明、年を指定しますが、ジャンルはありません。私はそれをデバッグし、発見する: 1私は2つのジャンルで提出する。 2つのヌルのリストを作成します。 2 Initバインダーメソッドが呼び出されませんでした。

+0

「ジャンル」はリストまたは配列ですか?あなたのinitバインダー(Genre.classにマッチしようとしている)は、そのような配列にマッチするとは思わない。配列のバインドに関する例を見つける必要があると思います。 – Metroids

答えて

0

は、あなたが、私はこの方法が原因「ジャンル」の制限に呼び出さないと思う

@InitBinder 

@InitBinder(value = "genres") 

から変更しようとしてもらいます。

関連する問題