AndreaNobili
AndreaNobili

Reputation: 42957

Why I can't redirect from a Spring MVC controller method to another controller method?

I am pretty new in Spring MVC and I have some problem trying to redirect to a controller method after that another controller method terminate its execution.

So I have the following situation. Into a controller class I have this method that correctly handle POST request toward the validaProgetti resource:

@RequestMapping(value = "validaProgetti", method=RequestMethod.POST)
public @ResponseBody String validaProgetti(@RequestBody List<Integer> checkedRowList) {
            
    System.out.println("ID progetti da aggiornare: " + checkedRowList);
    
    List<Twp1007Progetto> progettiDaValidare =  new ArrayList<Twp1007Progetto>(); 
    
    for (int i=0; i<checkedRowList.size(); i++) {
        System.out.println("ID PROGETTO: " + checkedRowList.get(i));
        progettiDaValidare.add(progettoService.getProgetto(checkedRowList.get(i)));
    }
    
    
    progettoService.validaProgetti(progettiDaValidare);
    
    return "redirect:ricercaValidazione";
}

So this method is correctly mapped and when the validaProgetti resource is called it is executed.

At the end of this method I don't return a view name that render a JSP page but I have to redirect to another method (that do something and render a JSP page). So, instead to return a view name, I redirect toward another resource:

return "redirect:ricercaValidazione";

Then in the same controller class I have declared this method that handle request toward this ricercaValidazione resource:

@RequestMapping(value = "ricercaValidazione", method=RequestMethod.POST)
public String ricercaValidazione(@ModelAttribute ConsultazioneFilter consultazioneFilter, Model model, HttpServletRequest request) {
    
    RicercaConsultazioneViewObject filtro = null;
    try {
        filtro = new ObjectMapper().readValue(request.getParameter("filtro"), RicercaConsultazioneViewObject.class);
        filtro.setSelStatoProgetto(3);      // Progetti da validare
    } catch (IOException e) {
        logger.error(e);
    }

    consultazioneFilter = new ConsultazioneFilter(filtro);
    model.addAttribute("consultazioneFilter", consultazioneFilter);
    
    model.addAttribute("listaProgetti", new ListViewObject<Twp1007Progetto>(progettoService.getListaProgettiConsultazione(consultazioneFilter)) );
    
    return "validazione/tabellaRisultati";
}

The problem is that it can't work and after the redirection can't enter into the ricercaValidazione() method.

I think that maybe the problem is that this ricercaValidazione() method handle POST request toward the ricercaValidazione resource and the return "redirect:ricercaValidazione"; maybe generate a GET request.

But I am not sure about it.

Why? What am I missing? How can I solve this issue?

Upvotes: 0

Views: 1587

Answers (2)

Giovanni
Giovanni

Reputation: 4015

the redirect and fordward prefix are for resolving views; you are tring to redirect from one controller to another one. This can be done but redirect works in the following way

  1. A response is sent to the browser with the redirect http status code and and url
  2. The browser loads via GET the request URL
  3. Your Spring controller (and the corresponding ammping method) is invocated if it matches the annotation params

From what you write I'm not sure this is what you really want; as you already noted there is a mismatch between HTTP methods (GET vs POST).

Your second method ricercaValidazione expects a filtro param in order to filter some data, but in the validaProgetti there is nothing similar, so it seems that the two controllers are not directly chainable. If what you want is to display a page after validaProgetti that shows a form and the the user can submit it you must add a method annotated with a method GET and url ricercaValidazione; the new method must return the view containing the form; which points via POST to url of validaProgetti. In this way you can redirect from ricercaValidazione to validaProgetti

Upvotes: 2

dinesh.kumar
dinesh.kumar

Reputation: 168

Give mapping name of your controller with redirect like

  redirect:/controll-mapping_name/ricercaValidazione

have a look on this question

Unable to redirect from one controller to another controller-Spring MVC

Upvotes: 0

Related Questions