spring boot存放views的默认路径在哪呢?
写了一个简单Controller的ExceptionHandler,代码如下:
@Controller public class SelfExceptionController { @RequestMapping("/demoexception") public String demoException() throws Exception { if(true){ throw new Exception("This is for Demo Exception"); } return "demo"; } @ExceptionHandler public String exceptionHandler(Exception e){ return "error3"; } }
那么这个error3 view 应该存放在什么地方呢?
当使用spring boot的默认配置时(没有添加过任何template engine,以及没有修改过spring.resources.static-locations,也没有配置spring mvc view. 如spring.mvc.view.prefix和spring.mvc.view.suffix)时,它只是forward到/error3这个地址。如果没有任何定义urlmapping 到这个地址,则会找不到,然后就会forward到默认的server.error.path中去,即/error这个地址,如果没有disable server.error.whitelabel.enable这个设置的话,就是显示默认的whitelable。
如果设置了spring.mvc.view.suffix的话,比如设置为.html。 那么当exception发生时,ContentNegotiatingViewResolver最终会认为是jstlview. 就会farward/error3.html这个地址上来。他就会在默认的static-locations下先查找error3.html这个文件,如果没有找到的话就会到servlet的document目录下去查找,tomcat的默认路径就是webapp(注意:webapp目录与resources目录是平级的)下查找。spring.mvc.view.prefix和spring.mvc.view.suffix的设置就是对jsp servlet context的,而且是相对路径。而其他template engine的prefix则是classpth下的路径,设置时需要添加classpath:
如果spring boot在使用任何一个template engine时,ContentNegotiatingViewResolver就会认为这个是一个特定的template engine view,就会到默认配置的resources/templates/目录下查找。如果找不到就会跑出错误。
在ContentNegotiatingViewresolver的resolveViewName中,先获取candidateViews, 然后再获取最佳View。(注意:这里选择的最佳view有可能在templates下根本就不存在,从而导致view.render()的时候就会抛出Error resolving template [hello], template might not exist or might not be accessible by any of the configured Template Resolvers的错误)