почему моя форма не передает информацию в весеннюю загрузку - PullRequest
0 голосов
/ 20 января 2019

Здравствуйте, я передаю информацию в форме, и все работает нормально, но когда я заполняю форму, она не передает информацию, и я получаю эту ошибку.

Произошла непредвиденная ошибка (type = InternalОшибка сервера, статус = 500).Причины: org.hibernate.exception.ConstraintViolationException: не удалось выполнить инструкцию1006 *

И

 <form th:action="@{/save}" method="post" >
    <p><input type="text" id="movie_id" name="movie_id" value="" /></p>
    <p><input type="text" id="movie_name" name="movie_name" value="" /></p>
    <p><input type="submit" value="save" /></p>
     </form>

Я верю, что все остальные коды верны, потому что, если я пытаюсь отобразить информацию БД, у меня нет проблем.

Обновление

Это полный HTML-код.

<div class="container">   
<table class="table table-hover">
    <tr>
        <th>Id</th>
        <th>Name</th>
    </tr>
    <tr th:each="LatestMovies : ${latestMovies}">
        <td th:text="${LatestMovies.id}"></td>
        <td th:text="${LatestMovies.movieName}"></td>
        <td>
       <form th:action="@{/save}" method="post" th:object="${newMovie}">
<p><input type="text" id="movie_id" th:field="*{movie_Id}"/></p>
<p><input type="text" id="movie_name" th:field="*{movie_Name}"/></p>
<p><input type="submit" value="save" /></p>
    </form>
</td>

    </tr>
</table>

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Ваш контроллер ожидает объект Movie, но он получает что-то еще, что затем создает нулевой объект Movie. Вам нужно использовать th:object в вашей форме, чтобы правильно отправить соответствующий класс. Во-первых, давайте добавим новый @ModelAttribute в ваш контроллер, чтобы ваша форма могла автоматически отображать ваш объект Movie в вашей форме.

Контроллер

// In order to use th:object in a form, we must be able to map a new entity to that form.
// In this case we return a Movie entity.
@ModelAttribute(value = "newMovie")
public Movie newMovie() {return new Movie();}

Теперь давайте изменим вашу форму, чтобы она действительно отправляла объект Movie.

<form th:action="@{/save}" method="post" th:object="${newMovie}">
    <p><input type="text" id="movie_id" th:field="*{movie_id}"/></p>
    <p><input type="text" id="movie_name" th:field="*{movie_name}"/></p>
    <p><input type="submit" value="save" /></p>
</form>

Обратите внимание, что я также изменил атрибут name в ваших входах для th:field. Помните, что для того, чтобы это работало, имя каждого поля должно точно совпадать с именами в ваших объектах.

Обновление

Если вы хотите установить значение по умолчанию для вашей формы, без использования js и поскольку вы не можете объединить th:field с th:value, вы можете установить атрибут объекта в вашем контроллере.

@ModelAttribute(value = "newMovie")
public Movie newMovie() {
    Movie movie = new Movie();
    movie.setName("Test");
    return movie;
}

Обновление 2

Если вы хотите поместить текущую итерацию списка Thymeleaf в вашу форму, вы можете сделать следующее.

<div class="container">   
<table class="table table-hover">
   <tr>
      <th>Id</th>
      <th>Name</th>
   </tr>
   <tr th:each="LatestMovies : ${latestMovies}">
      <td th:text="${LatestMovies.id}"></td>
      <td th:text="${LatestMovies.movieName}"></td>
      <td>
          <form th:action="@{/save}" th:object="${LatestMovies}" method="post">
              <p><input type="hidden" th:value="*{id}"/></p>
              <p><input type="hidden" th:value="*{movieName}"/></p>
              <p><input type="submit" value="Submit"/></p>
          </form>
      </td>
   </tr>
</table>

0 голосов
/ 20 января 2019

Это происходит потому, что объект фильма, который вы пытаетесь отправить из формы в контроллер, не отображается должным образом .В результате это нарушает ограничение movie_id, которое имеется в вашей таблице фильмов (PK, я думаю, не ноль), пытаясь вставить в него ненулевое значение .Если вы хотите, чтобы объект, сформированный в форме страницы внешнего интерфейса, был связан с объектом Java, вы можете попробовать эту

форму первой страницы

<form:form action="save" modelAttribute="movie" method="POST">
    <form:label path = "movie_id"> Movie id</form:label>
    <form:input path="movie_id" name="movie_id">
    <form:label path = "movie_name"> Movie name</form:label>
    <form:input path="movie_name" name="movie_name">
    <button type="submit">save</button>
</form:form>

(следует импортироватьна вашей странице пружинная форма taglib <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>)

Сохранить код контроллера

@PostMapping("/save")
public String save(@ModelAttribute("movie") Movie movie) {
savedMovie.save(movie);
return "redirect:/LatestMovies";
}

Конечно, я предполагаю, что ваш объект имеет похожую структуру, как показано ниже

Класс фильма

public class Movie{
  private String movie_id; // or int or long
  private String movie_name;
  //getters setters constructors ommitted
}
0 голосов
/ 20 января 2019

Вы забыли пометить параметр метода аннотацией @RequestBody.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...