添加 PathVariable 更改 RequestMapping 上的视图路径

Adding PathVariable changes view path on RequestMapping

我有一个视图解析器:

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("WEB-INF/jsp/");
    resolver.setSuffix(".jsp");
    return resolver;
}

和控制器:

@Controller
public class WorkflowListController {

 @RequestMapping(path = "/workflowlist", method = RequestMethod.GET)
 public ModelAndView index() throws LoginFailureException, PacketException,
        NetworkException {

    String profile = "dev";
    List<WorkflowInformation> workflows = workflows(profile);

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("profile", profile);
    map.put("workflows", workflows);
    return new ModelAndView("workflowlist", map);
 }
}

当我调用页面 http://127.0.0.1:8090/workflowlist 时,它服务于来自 src/main/webapp/WEB-INF/jsp/workflowlist.jsp 的 jsp。这一切似乎都运作良好。

但是当我尝试添加 @PathVariable:

@RequestMapping(path = "/workflowlist/{profile}", method = RequestMethod.GET)
public ModelAndView workflowlist(@PathVariable String profile)
        throws LoginFailureException, PacketException, NetworkException {

    List<WorkflowInformation> workflows = workflows(profile);

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("profile", profile);
    map.put("workflows", workflows);
    return new ModelAndView("workflowlist", map);
}

当我调用页面 http://127.0.0.1:8090/workflowlist/dev 时给出以下消息:

There was an unexpected error (type=Not Found, status=404).
/workflowlist/WEB-INF/jsp/workflowlist.jsp

有人可以解释为什么我在两种情况下都返回相同的视图名称,但在第二个示例中它的行为不同吗?

我怎样才能让它工作?

问题出在我的 viewResolver:

resolver.setPrefix("WEB-INF/jsp/");

应该是:

resolver.setPrefix("/WEB-INF/jsp/");

前面有 / 的路径是从根目录(webapps 文件夹)获取的,但是当缺少 / 时,它将成为相对路径。

我从来没有得到关于为什么视图解析器只采用路径的目录部分的答案,但这似乎是发生的事情。 这可能是您可以定义具有不同根的视图的子树。