我是Thymeleaf的新手,正在尝试检查模板中的null属性

<form th:action="@{/saveUser/__${user.id}__}" th:object="${user}" method="post">


如果我正在编辑一个已经定义了ID的现有用户,则该表单可以很好地提交,但是使用相同的表单添加一个新用户,我得到以下信息

HTTP Status 400 - http://localhost:8080/myApp/saveUser/null"


我的控制器:

@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("user") User user, @PathVariable Long id, Model model) {
    model.addAttribute("user", user);
    userRepo.save(user); //JPA Repo
    return "success";
}


我的想法是,如果我可以检查null ID,就可以以某种方式插入唯一的ID。更好的是,如果我可以使用User对象ID上的@GeneratedValue设置,那么我认为我的状况会很好

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;


EDIT包括我的用户编辑表单方法,该方法返回相同的表单,但预先填充了用户的模型属性

@RequestMapping(value = "/edit/user/{id}", method = RequestMethod.GET)
public ModelAndView getUserEditForm(@PathVariable Long id, Model model){
    ModelAndView mav = new ModelAndView("userForm");
    User user = userRepo.findOne(id);
    mav.addObject("userForm", user);
    return mav;
}


编辑2包括我的整个表格(用户“隐藏” ID)

<form th:action="@{/saveUser/__${user.id}__}" th:object="${user}" method="post">
    <input id="id" type="hidden" th:field="*{id}" />
    <input id="id" type="text" th:field="*{name}" />
    <input id="id" type="text" th:field="*{address}" />
    <button id="save">Save</button>
</form>

最佳答案

根据讨论,假定以下方法是您要调用的方法,该方法应填充用户对象,从而导致表单提交失败:

@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("user") User user, @PathVariable Long id, Model model) {
    model.addAttribute("user", user);
    userRepo.save(user); //JPA Repo
    return "success";
}


该方法不起作用的原因是因为您可能首先要传递一个空的用户对象。
要对此进行补救,您需要执行检查以确保在调用页面之前对象不为null。

一种解决方案可能是:

@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("user") User user, @PathVariable Long id, Model model) {
    userRepo.save(user); //JPA Repo

    if(user == null)         // check if user object is empty
       user = new User();    // if user is empty, then instantiate a new user object

    model.addAttribute("user", user);

    return "success";
}


上面的内容将确保在将用户对象传递到模型时,它始终可用。

09-03 20:06
查看更多