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

时间:2016-05-18 22:05:20

标签: 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)

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

我的配置类:

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

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/htmlviews/**").addResourceLocations("/htmlviews/");
    }
}

初​​始化器:

    public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

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

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

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

和控制器:

@Controller
public class IndexController {

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

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

整个文件结构很简单:

whole file srtucture is simple :

我正在使用Idea IDE(也在eclipse中试过,同样的例外)并试图在tomcat上部署。在pom.xml中,我添加了&#39; jstl&#39;依赖,但这无助于解决问题。  使用xml配置一切正常。我不知道我的spring java配置有什么问题,它非常简单,也许我忘记了什么?

修正了 当我将弹簧版本从4.1.0.RELEASE更改为4.2.3.RELEASE时,一切都开始有效了。我不知道为什么它不能与4.1.0.RELEASE一起使用。也许有人可以解释,只是好奇。

2 个答案:

答案 0 :(得分:4)

问题

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

可能的解决方案1 ​​

MyWebConfig 类中,添加以下内容:

@Override
public void configureViewResolvers(final ViewResolverRegistry registry) {
    registry.jsp("/htmlviews/", ".jsp");
}  

或者你可以这样做:

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

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

可能的解决方案2

将所有 htmlviews 文件夹保存在资源下,以便Spring可以根据您的资源解析程序找到它。

更新

在Spring启动应用程序中很少需要HTML。我强烈建议使用模板引擎(首选 Thymeleaf )。这样,对于大多数多页面应用程序而言,合理的默认设置就足够了。

答案 1 :(得分:1)

我正在尝试实现demo https://spring.io/guides/gs/securing-web/,但我遇到了类似的问题,要注意 - 这个演示只有html与thymleaf(没有JSP)我错过了添加thymleaf依赖(错误的原因)早先它显示错误

Circular view path []: would dispatch back to the current handler URL ..error

然后我添加了bean视图解析器,它开始出错。

Could not resolve view with name..error

最后,在删除bean视图解析器并为thymleaf添加依赖项后,它才起作用。添加这个使我的项目工作。

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

我发现在How to avoid the "Circular view path" exception with Spring MVC test

上了解了所有这些帮助