web-dev-qa-db-ja.com

javaconfigを使用して、「ディスパッチャ」という名前のサーブレットで「htmlviews / index.html」という名前のビューを解決できませんでした

私はそのような例外を受け取ります:

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で、「jstl」依存関係を追加しましたが、問題を解決します。xml構成を使用すると、すべてが正常に機能します。私のスプリングの何が問題かはわかりませんJava構成、それは非常に単純で、おそらく何かを忘れましたか?

修正しましたスプリングバージョンを4.1.0.RELEASEから4.2.3.RELEASEに変更すると、すべてが機能し始めました。 4.1.0.RELEASEで動作しない理由はわかりません。たぶん誰かが説明できます、好奇心旺盛です。

6
Edgar

問題

Springはwebappディレクトリの下でビューを見つけようとしています。 view resolverがないため、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フォルダーをリソースの下に配置して、Springがリソースリゾルバーに従ってフォルダーを見つけられるようにします。

更新

SpringブートアプリでHTMLが必要になることはほとんどありません。テンプレートエンジンを使用することを強くお勧めします(Thymeleafが推奨されます)。このように、ほとんどのマルチページアプリケーションでは、適切なデフォルト設定で十分です。

7
Minjun Yu

私はデモを実装しようとしていました 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>

Spring MVCテストで「循環ビューパス」例外を回避する方法

1
Vikash