检查Thymeleaf模板中的空属性

时间:2015-06-25 03:16:07

标签: java spring thymeleaf

我是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上的@GeneratedValue设置,那么我认为我的身体状况良好

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

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

@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为&#34;隐藏&#34;来自用户)

<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>

2 个答案:

答案 0 :(得分:1)

根据讨论,假设您调用的方法应该填充用户对象,因此提交时表单失败:

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

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

答案 1 :(得分:0)

我通过在@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";
}