私はそのような例外を受け取ります:
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
構成を使用すると、すべてが正常に機能します。私のスプリングの何が問題かはわかりませんJava構成、それは非常に単純で、おそらく何かを忘れましたか?
修正しましたスプリングバージョンを4.1.0.RELEASE
から4.2.3.RELEASE
に変更すると、すべてが機能し始めました。 4.1.0.RELEASE
で動作しない理由はわかりません。たぶん誰かが説明できます、好奇心旺盛です。
Springはwebappディレクトリの下でビューを見つけようとしています。 view resolverがないため、Springは「htmlviews/index.html」を解決できません。つまり、Springはそれが何であるかを知りません。
HTMLページにResource Resolverがありますが、HTMLは静的であるため問題ありません。
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よりも強力なので、お勧めします。
すべてのhtmlviewsフォルダーをリソースの下に配置して、Springがリソースリゾルバーに従ってフォルダーを見つけられるようにします。
SpringブートアプリでHTMLが必要になることはほとんどありません。テンプレートエンジンを使用することを強くお勧めします(Thymeleafが推奨されます)。このように、ほとんどのマルチページアプリケーションでは、適切なデフォルト設定で十分です。
私はデモを実装しようとしていました 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>