Hỏi lỗi không bắt được dữ liệu form trong java spring boot mvc

Em chào mọi người, em đang học spring boot, đến phần handle form thì em đang không bắt được dữ liệu gửi lên từ form bằng phương thức POST, mọi người giúp em với ạ.

Đây là code của form:

<form th:action="@{/addTodo}" method="POST" th:object="${ToDo}" class="form" role="form">
  <div class="form-group">
      <label>Name</label>
      <input
              type="text"
              class="form-control"
              placeholder="Input field"
              value="Test Name"
              th:field="*{_todoName}"
      />
  </div>
  <div class="form-group">
      <label>Description</label>
      <input
              type="text"
              class="form-control"
              placeholder="Input field"
              value="Test des"
              th:field="*{_todoDescription}"
      />
  </div>

  <button type="submit" class="btn btn-primary">Save</button>
</form>

Code controller:

    @PostMapping("/addTodo")
    public String AddTodo(@ModelAttribute Todo ToDo,Model model,@RequestParam Map<String,String> allRequestParams) {
        System.out.println(allRequestParams); //Nhận được dữ liệu
        System.out.println(model);            //Nhận được đối tượng Todo là null
        System.out.println(ToDo);             //Nhận được đối tượng Todo là null
        return "redirect:/to-do-list";
    }

Model Todo

@Data
@AllArgsConstructor
public class Todo {
    private String _todoName;
    private String _todoDescription;
}

Khi tiến hành gửi từ form lên controller, đây là kết quả em bắt bằng debug:

Em không thể lấy giá trị bằng @ModelAttribute là vì sao ạ?
Rất mong được mọi người giúp đỡ, em xin chân thành cảm ơn ạ.

private String _todoName;
private String _todoDescription;

không có get/set sao nó bắt
Nếu không muốn xài get/set thì chuyển qua public nhé

e tham khảo ở đây nhé

<form:form method="POST" action="/spring-mvc-basics/addEmployee"
  modelAttribute="employee">
    <form:label path="name">Name</form:label>
    <form:input path="name" />
    <form:label path="id">Id</form:label>
    <form:input path="id" />
    <input type="submit" value="Submit" />
</form:form>
3 Likes

À em dùng thư viện lumbok, không cần khai báo getset, khai báo @Data là nó tự sinh các hàm getter, setter rồi, thêm @AllArgsConstructor là sinh ra thêm Constructor với đầy đủ properties. Bác tham khảo ở đây nhé.


Còn code bác đưa là code jsp thì phải, còn em dùng là thym leaf nên không áp dụng được, dù sao cũng cảm ơn bác rất nhiều vì đã nhiệt tình giúp đỡ.

Bạn thử sửa thành @ModelAttribute(“toDo”) ToDo toDo xem được không?

2 Likes

Mình cũng thử rồi không được bạn ạ

Nói thật là mình không rành mấy cái này.
Nhưng:

th:field="*{_name}"

th:field="*{_description}"

Nó có liên quan gì đến 2 trường của Todo không?

    private String _todoName;
    private String _todoDescription;

_name == _todoName???
_description == _todoDescription???

4 Likes

chân thành cảm ơn bác đã cho em thấy cái sai, do trước khi up bài lên daynhauhoc em có sửa lại một chút quên mất không update lại phần đã sửa lên daynhauhoc, sai phạm của em, em chân thành xin lỗi và cũng chân thành cảm ơn bác đã chỉ ra cho em. Em đã update lại. Nhưng vấn đề vẫn chưa được giải quyết :frowning: .

1 Like

Sau vài ngày thì em thấy có 2 cách sửa thế này, nhưng vẫn không rõ nguyên nhân share lại cho ai có bị giống em thì có thể tham khảo.

  1. Xoá bỏ thư viện lombok thử nghiệm, nếu vẫn không được thì trả thư viện đó lại.
  2. Xoá bỏ phương thức khởi tạo rỗng ( chắc chắn được nhưng lại không khuyến khích)
  3. Bỏ dấu gạch dưới khi đặt tên, nó sẽ chuyển từ thế này:
    OLD
@Data
@AllArgsConstructor
public class Todo {
    private String _todoName;
    private String _todoDescription;
}

Thành thế này

@Data
@AllArgsConstructor
public class Todo {
    private String todoName;
    private String todoDescription;
}

Xin chân thành cảm ơn mọi người đã giúp đỡ.

2 Likes

Đây là một project khác mình tạo ra để test, bỏ lombok, bỏ dấu gạch dưới và nó chạy oki.

Model User

public class User {
    private String name;
    private String password;

    public User() {
    }

    public User(String name, String passWord) {
        this.name = name;
        this.password = passWord;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassWord() {
        return password;
    }

    public void setPassWord(String passWord) {
        this.password = passWord;
    }
}

Index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<form action="/ReceiverData" th:object="${User}" method="POST">
    First name:<br>
    <input type="text" th:field="*{name}">
    <br>
    Last name:<br>
    <input type="text" th:field="*{passWord}">
    <br><br>
    <input type="submit" value="Submit">

</form>

<p>If you click the "Submit" button, the form-data will be sent to a page called "/action_page.php".</p>

</body>
</html>

Controller

@Controller
public class Main {
    @GetMapping("/")
    String index(Model model) {
        model.addAttribute("User", new User("a","b"));
        return "index";
    }

    @PostMapping("/ReceiverData")
    String Receiver(@ModelAttribute("User") User user) {
        System.out.println(user.getName() + "-" + user.getPassWord());
        return "redirect:/";
    }

}

Kết qủa

2 Likes

Nhờ các mod close bài giùm mình, mình chân thành cảm ơn.

Cho thoả lòng chủ thớt :kissing:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?