使用 Thymeleaf 和 Spring Boot 将我的 HTML 中的整数数组传递给控制器

Posted

技术标签:

【中文标题】使用 Thymeleaf 和 Spring Boot 将我的 HTML 中的整数数组传递给控制器【英文标题】:Passing an array of ints from my HTML to Controller with Thymeleaf and SpringBoot 【发布时间】:2020-04-28 01:26:32 【问题描述】:

我正在尝试将一个整数数组从我的 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;

然后在我看来,我显示一些值并隐藏我不需要显示的 id,以便我可以将它们传递回我的控制器:

        <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 在控制器之间来回传递对象,或者是否有其他属性可以用来来回传递数组?

提前致谢

康纳

【问题讨论】:

【参考方案1】:

也许您应该将数字作为列表发送到控制器。

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


另一种方法是使用 AJAX 调用控制器。只需要在 javascript 中收集数字作为列表,并通过 ajax 将数组作为 json 发送到控制器。在控制器中,您将解析它们

【讨论】:

【参考方案2】:
<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";

【讨论】:

嗨,谢谢。不幸的是,它没有用。每当我将其更新到 th:field 时,我都会收到以下错误:java.lang.IllegalStateException: Bean name 'movie' 的 BindingResult 和普通目标对象都不能用作请求属性 你能发布你的get控制器方法,它返回的是theleaf模板页面。 我现在已经在那里添加了控制器方法。感谢您的快速回复:-) 嗨,th:field 对我不起作用,我收到了上面的绑定错误

以上是关于使用 Thymeleaf 和 Spring Boot 将我的 HTML 中的整数数组传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

spring boot中使用thymeleaf

Spring boot Thymeleaf 配置

Bootstrap 不能与 spring-boot 一起使用?

spring-boo hello world程序

使用 spring、thymeleaf 和 mongo 填充 html 选择

Thymeleaf模板引擎+Spring整合使用方式的介绍