Clay Banks
Clay Banks

Reputation: 4581

Checking for Null Attribute in Thymeleaf Template

I am new to Thymeleaf and am trying to check for a null attribute in my template

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

The form submits fine if I am editing an existing user with an id already defined, however using the same form to add a new user I get the following

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

My controller:

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

My thought is if I can check for the null id I can plug in a unique one somehow. Better yet, if I could make use of the @GeneratedValue set on my User object's ID then I think I'd be in good shape

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

EDIT Including my user edit form method which returns the same form but pre-populated with the User's model Attributes

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

EDIT 2 Including my whole form (ID is "hidden" from user)

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

Upvotes: 0

Views: 1945

Answers (2)

Clay Banks
Clay Banks

Reputation: 4581

I've temporarily resolved this by creating a new @Controller to accept "null" at the end of the @RequestMapping (which kind of makes sense when creating a new user with a dynamic ID?), and just reimplementing the same logic. So when this is called

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

It is mapped to my new Controller

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

Upvotes: 0

Aeseir
Aeseir

Reputation: 8414

As per discussion assuming that the following method is the one you call which should populate the user object and thus form fails on submission:

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

The reason that method doesn't work is because you are potentially passing an empty user object to begin with. To remediate this you need to implement checks to ensure object is not null prior to calling the page.

one solution could be:

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

The above will ensure that when you passing user object to the model, it is always available.

Upvotes: 1

Related Questions