检查 Thymeleaf 模板中的空属性

Checking for Null Attribute in Thymeleaf Template

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

<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";
}

我的想法是,如果我可以检查空 ID,我可以以某种方式插入一个唯一的 ID。更好的是,如果我可以利用我的用户对象 ID 上的 @GeneratedValue 集,那么我认为我的状态会很好

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

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

@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 是来自用户的 "hidden")

<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";
}

该方法不起作用的原因是因为您可能一开始就传递了一个空的用户对象。 要解决此问题,您需要执行检查以确保对象在调用页面之前不为空。

一个解决方案可能是:

@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";
}

以上将确保当您将用户对象传递给模型时,它始终可用。

我暂时解决了这个问题,方法是创建一个新的 @Controller 以在 @RequestMapping 的末尾接受 "null"(这在使用动态 ID?),并重新实现相同的逻辑。所以当这被称为

http://localhost:8080/myApp/saveUser/null"

它映射到我的新控制器

@RequestMapping(value = "/saveUser/null", method = RequestMethod.GET)
public ModelAndView saveUser(@ModelAttribute("user") User user,  Model model){
    model.addAttribute("user", user);
    userRepo.save(user);
    return "success";
}