使用javaconfig无法在名称为'dispatcher'的servlet中解析名称为'htmlviews / index.html'的视图

Edg*_*gar 4 spring spring-mvc servlet-mapping

我得到这样的异常:

javax.servlet.ServletException: Could not resolve view with name 'htmlviews/index.html' in servlet with name 'dispatcher'
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1211)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Run Code Online (Sandbox Code Playgroud)

当我尝试连接到完全Java配置的Spring Web服务时。

我的配置类:

@Configuration
@EnableWebMvc
@ComponentScan({"config", "controller"})
public class MyWebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/htmlviews/**").addResourceLocations("/htmlviews/");
    }
}
Run Code Online (Sandbox Code Playgroud)

初始化器:

    public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{MyWebConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
Run Code Online (Sandbox Code Playgroud)

和控制器:

@Controller
public class IndexController {

    @RequestMapping(value = "/")
    public String getIndexPage() {
        return "htmlviews/index.html";
    }

    @RequestMapping(value = "/{[path:[^\\.]*}")
    public String index() {
        return "forward:/";
    }
}
Run Code Online (Sandbox Code Playgroud)

整个文件结构很简单:

整个文件结构很简单:

我正在使用Idea IDE(也在eclipse中尝试过,同样的异常)并尝试在tomcat上进行部署。在中pom.xml,我添加了'jstl'依赖关系,但这无助于解决问题。使用xml配置,一切正常。我不知道我的spring java配置有什么问题,它超级简单,也许我忘记了什么?

固定它 一切都开始工作,当我从改变弹簧的版本4.1.0.RELEASE4.2.3.RELEASE。我不明白为什么它不起作用4.1.0.RELEASE。也许有人可以解释,只是好奇。

Min*_* Yu 7

问题

Spring尝试在您的webapp目录下查找视图。由于您没有任何视图解析器,因此Spring无法解析“ htmlviews / index.html”。换句话说,Spring不知道它是什么。
您的html页面有一个资源解析器,因为HTML是静态的,所以可以。

可能的解决方案1

在您的MyWebConfig类中,添加以下内容:

@Override
public void configureViewResolvers(final ViewResolverRegistry registry) {
    registry.jsp("/htmlviews/", ".jsp");
}  
Run Code Online (Sandbox Code Playgroud)

或者您可以这样做:

@Bean
public InternalResourceViewResolver jspViewResolver() {
    InternalResourceViewResolver resolver= new InternalResourceViewResolver();
    resolver.setPrefix("/htmlviews/");
    resolver.setSuffix(".jsp");
    return resolver;
}  
Run Code Online (Sandbox Code Playgroud)

将您的html页面更改为jsp页面,我建议这样做,因为jsp比HTML更加强大。

可能的解决方案2

将所有htmlviews文件夹倒入资源下,以便Spring可以根据您的资源解析器找到它。

更新资料

Spring引导应用程序很少需要HTML。我强烈建议使用模板引擎(首选Thymeleaf)。这样,明智的默认设置对于大多数多页应用程序就足够了。