【问题标题】:Could not resolve view with name 'htmlviews/index.html' in servlet with name 'dispatcher' using javaconfig无法使用 javaconfig 在名称为“dispatcher”的 servlet 中解析名称为“htmlviews/index.html”的视图
【发布时间】:2016-09-15 14:30:14
【问题描述】:

我得到这样的异常:

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:/";
    }
}

整个文件结构很简单:

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

已修复 当我将 spring 版本从 4.1.0.RELEASE 更改为 4.2.3.RELEASE 时,一切都开始工作了。我不知道为什么它不适用于4.1.0.RELEASE。也许有人可以解释一下,只是好奇。

【问题讨论】:

    标签: spring spring-mvc servlet-mapping


    【解决方案1】:

    问题

    Spring 正在尝试在您的 webapp 目录下查找视图。由于您没有任何 视图解析器,因此 Spring 无法解析“htmlviews/index.html”。换句话说,Spring 不知道它是什么。
    您的 html 页面有一个 Resource Resolver,这没问题,因为 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文件夹放到resources下,这样Spring就可以根据你的Resource Resolver找到它了。

    更新

    在 Spring Boot 应用程序中很少需要 HTML。我强烈推荐使用模板引擎(Thymeleaf 是首选)。这样,合理的默认设置对于大多数多页应用程序来说已经足够了。

    【讨论】:

    • 感谢您的回复,您的解决方案会很好,但我想使用html,然后我可以使用bower 导入网络依赖项。已经修好了,不知道为什么,但这是因为春季版本。
    • 是的,没问题。很高兴你解决了这个问题。我的解决方案 2 应该适用于 html。
    • ConfigureViewResolvers 为我解决了这个问题。干杯!
    【解决方案2】:

    我试图实现演示 https://spring.io/guides/gs/securing-web/ 但我遇到了类似的问题,请注意 - 这个演示只有带有 thymleaf 的 html(没有 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找到了更多帮助来理解所有这些工作

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2015-01-18
      • 2017-05-04
      • 1970-01-01
      相关资源
      最近更新 更多