-->

Adding PathVariable changes view path on RequestMa

2019-07-26 09:30发布

问题:

I have a view resolver:

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

and a controller:

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

and when I call the page http://127.0.0.1:8090/workflowlist it serves the jsp from src/main/webapp/WEB-INF/jsp/workflowlist.jsp. That all seems to work well.

However when I try to add a @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);
}

When I call the page http://127.0.0.1:8090/workflowlist/dev gives the following message:

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

Can someone explain why I'm returning the same view name in both cases but in the second example it is behaving differently?

How can I get it to work?

回答1:

The problem was with my viewResolver:

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

should have been:

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

With a / at the front the path is taken from the root (webapps folder) but when the / is missing it becomes a relative path.

I never got an answer as to why the view resolver only took the directory part of the path but that's what appeared to happen. It's probably so you can define subtrees of views with different roots.