dylaniato
dylaniato

Reputation: 516

Spring MVC + Thymeleaf: passing objects through pages

I'm developing a simple web application using spring MVC and thymeleaf. I have a form correctly handled by this method in my controller

@RequestMapping(value = "/list", method = RequestMethod.POST)
public ModelAndView searchJob(
        @ModelAttribute(SEARCH_PARAMS) @Valid SearchParams params,
        BindingResult bindingResult) {
    ModelAndView output = null;

    if (!bindingResult.hasErrors()) {

        JobsAPIImplService service = new JobsAPIImplService();
        JobsAPI api = service.getJobsAPIImplPort();

        ArrayList<NoaJob> jobs = (ArrayList<NoaJob>) (api.search(JobUtils.toSearchParams(params))).getItem();

        output = new ModelAndView("scheduler/list");
        output.addObject("jobs", jobs);
    } else { 
     // errors handling
    }

    return output;
}

So in my result page I can access to the ArrayList "jobs" in this way:

<tr th:each="job : ${jobs}">
    ...
</tr>

In the same page, I have a simple link which calls another GET method on the same controller. The goal here is to have the same ArrayList in another page in order to implement a "back" button without re-executing the search logic (a call to a web service). Here is the method called

@RequestMapping(value="/list/{id}", method = RequestMethod.GET)
public ModelAndView details(@PathVariable("id") String jobUuid,
        @ModelAttribute("jobs") ArrayList<NoaJob> jobs) {
    ModelAndView output = new ModelAndView("scheduler/details");

    LOGGER.info("Size jobs list: " + jobs.size());

    NoaJob job = new NoaJob();
    job.setJobUuid(jobUuid);
    output.addObject("job", job);
    output.addObject("jobs", jobs);

    return output;
}

the problem is that the arraylist here is always null! I read that in GET requests Spring allocates a new ModelAttribute, so how can I pass this object throug pages?

Upvotes: 0

Views: 3977

Answers (1)

witchedwiz
witchedwiz

Reputation: 305

Define a session attribute like this in the head of your controller:

    @SessionAttributes({ "myFancyList"})
    @Controller
    public class HomeController {
      // your code here
    }

Now.. when you have to insert the "list" to be viewable via thymeleaf:

output.addObject("myFancyList", jobs);

and modify thymleaf pseudocode accordingly.

in the "post" of the search "override" the session attribute with the current search result..

i think this should do the trick for you

Upvotes: 4

Related Questions