Передача массива целых чисел из моего HTML в контроллер с Thymeleaf и SpringBoot - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь передать массив целых чисел из моего HTML обратно в мой контроллер.

Мой поток выглядит следующим образом:

Я получаю данные из API и преобразовываю их к сущности. Все работает отлично. Тем не менее, я передаю это моему HTML (Thymeleaf) и отображаю некоторые значения для пользователя.

Затем они выбирают один из вариантов, и это передается обратно моему контроллеру. Именно на этом этапе я теряю нужные мне данные.

В моей организации я получаю следующие данные, которые я передаю в представление (пример ниже):

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MOVIE_ID")
private long movieId;

@JsonProperty("title")
@Column(name = "TITLE")
private String title;

@JsonProperty("overview")
@Column(name = "OVERVIEW", length = 2000)
private String overview;

@JsonProperty("popularity")
@Column(name = "POPULARITY")
private float popularity;

@JsonProperty("release_date")
@Column(name = "RELEASE_DATE")
private String releaseDate;

@JsonProperty("genre_ids")
private int[] genreIds;

Затем в моем В данном случае я отображаю некоторые значения и скрываю идентификаторы, которые мне не нужны, чтобы передать их обратно моему контроллеру:

        <form action = "#" th:action="@{/saveMovie}" method="post" th:object="${movie}">
        <tr>
            <td th:text="${movie.title}"></td>
            <td th:text="${movie.releaseDate}"></td>
            <td th:text="${movie.overview}"></td>
            <input type="hidden" id="title" name="title" th:value="*{title}"/>
            <input type="hidden" id="overview" name="overview" th:value="*{overview}"/>
            <input type="hidden" id="popularity" name="popularity" th:value="*{popularity}"/>
            <input type="hidden" id="releaseDate" name="releaseDate" th:value="*{releaseDate}"/>
            <input type="hidden" id="genreIds" name="genreIds" th:value="*{genreIds}"/>
            <td>
                <div class="col-auto">
                    <button class="btn btn-primary" type="submit">Add</button>
                </div>
            </td>
        </tr>
        </form>

Контроллер для обработки вызова:

@PostMapping("/saveMovie") public String saveMovie(@ModelAttribute(value = "movie") Movie movie)

ОБНОВЛЕНИЕ *** Добавление контроллеров GET / POST, которые в данный момент взаимодействуют с этой страницей:

@GetMapping("/searchMovie")
public String searchMovie(final Model model){

    List<Movie> returnedMovies = new ArrayList<>();

    model.addAttribute("movies", returnedMovies);

    return "Search";
}


@PostMapping("/searchMovie")
public String searchMovieInTMDB(@RequestParam(value = "movieName", required = true) String movieName,
                                Model model){

    List<Movie> returnedMovies = service.searchMovies(movieName);

    model.addAttribute("movies", returnedMovies);

    return "Search";
}

@PostMapping("/saveMovie")
public String saveMovie(@ModelAttribute(value = "movie") Movie movie){

    service.storeMovie(movie);

    return "WORK_IN_PROGRESS";
}

Однако, когда я передаю значения обратно в контроллер, я получаю ошибку преобразования:

[Failed to convert property value of type 'java.lang.String' to required type 'int[]' for property 'genreIds']

Я изменил его на String [], чтобы проверить это, и ошибка исчезла, но затем я столкнулся с другой проблемой, заключающейся в том, что она преобразуется в: String Value Image

Единственное единственное Я нашел способ передать объект обратно, используя тег ввода и скрывая их. Он отлично преобразует число с плавающей точкой, но не может обрабатывать массив целых чисел.

Есть ли лучший способ передавать объекты назад и вперед между контроллерами с помощью Thymeleaf или есть другой атрибут, который я могу использовать для передачи массива туда-сюда?

Заранее спасибо

Конор

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Может быть, вы должны отправить номера в виде списка в контроллер.

@PostMapping("/saveMovie")
public String saveMovie(@RequestBody List<Movie> movies){
    movieService.function_name(movies);
    return "movies";
}

Другой способ сделать это - использовать AJAX вызов контроллера. Просто нужно собрать числа в виде списка в javascript и через ajax вы должны отправить массив как json в контроллер. В контроллере вы их проанализируете

0 голосов
/ 10 января 2020
<form action="#" th:action="@{/saveMovie}" method="post"
    th:object="${movie}">
    <tr>
        <td th:text="${movie.title}"></td>
        <td th:text="${movie.releaseDate}"></td>
        <td th:text="${movie.overview}"></td>
        <input type="hidden" id="title" name="title" th:value="*{title}" />
        <input type="hidden" id="overview" name="overview"
            th:value="*{overview}" />
        <input type="hidden" id="popularity" name="popularity"
            th:value="*{popularity}" />
        <input type="hidden" id="releaseDate" name="releaseDate"
            th:value="*{releaseDate}" />
        <input type="hidden" name="genreIds" th:field="*{genreIds}" />
        <td>
            <div class="col-auto">
                <button class="btn btn-primary" type="submit">Add</button>
            </div>
        </td>
    </tr>
</form>

@PostMapping("/saveMovie")
public String saveMovie(@ModelAttribute Movie movie) {
    System.err.println(movie);
    return "redirect:/movies";
}

@GetMapping("/movies")
public String getBooks(Model model) {
    Movie movie = new Movie();
    movie.setGenreIds(new int[] {4,5,6,7,8});
    model.addAttribute("movie", movie);
    return "movie";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...