2016-09-28 5 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 Метод Init Binder не был вызван.

+0

«genres» - это список или массив, не так ли? Я не думаю, что ваше связывание init (которое пытается сопоставить Genre.class) будет соответствовать массиву, подобному этому. Я думаю, вам нужно найти примеры привязки массива. – Metroids

ответ

0

Вы пытаетесь изменить от

@InitBinder(value = "genres") 

в

@InitBinder 

Я думаю, что этот метод не называют в связи с ограничением на «жанров».