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

问题描述 投票:0回答:2

我对 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 请求。

但我不确定。

为什么?我缺少什么?我该如何解决这个问题?

spring spring-mvc redirect controller
2个回答
2
投票

redirect和forwardward前缀用于解析视图;您正尝试从一个控制器重定向到另一个控制器。这是可以完成的,但重定向按以下方式工作

  1. 响应会发送到浏览器,其中包含重定向 http 状态代码和 url
  2. 浏览器通过 GET 请求 URL 加载
  3. 如果 Spring 控制器(以及相应的 ammping 方法)与注释参数匹配,则会调用它

从你写的内容来看,我不确定这是否是你真正想要的;正如您已经注意到的,HTTP 方法(GET 与 POST)之间不匹配。

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


0
投票

提供带有重定向的控制器的映射名称,如

  redirect:/controll-mapping_name/ricercaValidazione

看看这个问题

无法从一个控制器重定向到另一个控制器-Spring MVC

© www.soinside.com 2019 - 2024. All rights reserved.