【问题标题】:Passing an array of ints from my HTML to Controller with Thymeleaf and SpringBoot使用 Thymeleaf 和 Spring Boot 将我的 HTML 中的整数数组传递给控制器
【发布时间】: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 在控制器之间来回传递对象,或者是否有其他属性可以用来来回传递数组?

提前致谢

康纳

【问题讨论】:

    标签: json spring spring-boot spring-mvc 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 对我不起作用,我收到了上面的绑定错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2019-07-05
      • 2017-10-28
      • 1970-01-01
      • 2020-02-09
      • 2021-07-06
      相关资源
      最近更新 更多