为什么我不能从Spring MVC控制器方法重定向到另一个控制器方法?

时间:2015-10-01 15:01:36

标签: spring spring-mvc redirect controller

我是Spring MVC的新手,在另一个控制器方法终止执行后,我在尝试重定向到控制器方法时遇到了一些问题。

所以我有以下情况。进入控制器类我有这个方法正确处理对 validaProgetti 资源的POST请求:

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

因此,此方法已正确映射,并且当 validaProgetti 资源被调用时,它将被执行。

在此方法结束时,我不返回呈现JSP页面的视图名称,但我必须重定向到另一个方法(执行某些操作并呈现JSP页面)。因此,为了返回视图名称,我重定向到另一个资源:

return "redirect:ricercaValidazione";

然后在同一个控制器类中,我声明了这个处理对此 ricercaValidazione 资源的请求的方法:

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

问题是它无法工作,并且在重定向后无法进入 ricercaValidazione()方法。

我认为问题可能是 ricercaValidazione()方法处理 ricercaValidazione 资源的 POST 请求以及返回“redirect:ricercaValidazione”; 可能会生成 GET 请求。

但我不确定。

为什么呢?我错过了什么?我该如何解决这个问题?

Tnx

2 个答案:

答案 0 :(得分:2)

重定向和转发前缀用于解析视图;你想从一个控制器重定向到另一个控制器。这可以完成,但重定向按以下方式工作

  1. 使用重定向http状态代码和url
  2. 将响应发送到浏览器
  3. 浏览器通过GET加载请求网址
  4. 如果Spring控制器(以及相应的ammping方法)与注释参数匹配,则会调用它。
  5. 从你写的东西来看,我不确定这是你真正想要的东西;正如您已经注意到的那样,HTTP方法(GET与POST)之间存在不匹配。

    你的第二种方法 ricercaValidazione 期望一个filtro param来过滤一些数据,但是在 validaProgetti 中没有类似的东西,所以似乎两个控制器都不是可直接连锁。如果你想要的是显示一个显示表格的 validaProgetti 之后的页面,并且用户可以提交它,你必须添加一个用方法GET和url ricercaValidazione 注释的方法;新方法必须返回包含表单的视图;通过POST指向 validaProgetti 的网址。通过这种方式,您可以从 ricercaValidazione 重定向到 validaProgetti

答案 1 :(得分:0)

使用

等重定向指定控制器的映射名称
TypeError: github.getUser is not a function
    at Scope.$scope.search (script.js:39)

看看这个问题

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

相关问题