web-dev-qa-db-ja.com

Spring BootでViewResolverを構成し、アノテーションはURIエラーでHTTPリクエストのマッピングが見つかりません

私は、最も単純なビューリゾルバとhtmlを使用して、gradle、spring boot、spring mvcで「hello world」アプリケーションを作成しようとしています。

thymeleaf spring boot example から始め、純粋なhtmlとInternalResourceViewResolverを使用してより単純なmvcアプリケーションを作成するためにthymeleafを削除したかっただけです。 src/main/webapp/WEB-INFにある単一のgreeting.htmlを提供します。アプリを実行すると

No mapping found for HTTP request with URI [/WEB-INF/greeting.html] in DispatcherServlet with name 'dispatcherServlet'

これは一般的なエラーであり、ウェブ上には多くの回答がありますが、何も解決しないようです。

これが私のApplication.Javaです

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

これが私のGreetingController.Javaです

@Controller
public class GreetingController {
    @RequestMapping("/greeting")
    public String greeting() {
        return "greeting";
    }
}

これが私のMvcConfiguration.Javaです

@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".html");
        return resolver;
    }
}

gradle bootRunで実行します

コードのレポは次のとおりです。 https://github.com/driver-pete/spring-mvc-example

さらにいくつかの手がかりがあります:

  • Thymeleafビューの解決は正常に動作します
  • InternalResourceViewResolverは正しいパスに解決します
  • WEB-INFとgreeting.htmlがwarファイルに存在するようです
  • 私はjspまたはjstlを持っていないので、一部の人が示唆するようにそれらのjarを見逃さない

私の仮説は、ディスパッチャサーブレットが何らかの形で here などの代わりに/ *ではなく/ *で機能するように設定されることです。ただし、web.xmlがないため、これらのアドバイスはここでは当てはまりません。ディスパッチャサーブレットをプログラムで設定する方法の例はたくさんありますが、アプリを最小限に抑えたいと思います。thymeleafで正常に動作するため、スプリングブートは適切に設定されるはずです。

30
otognan

デフォルトのサーブレットのみを有効にする必要があります。これを行うには、MvcConfigurationに次を追加します。

@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".html");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }    
}

本質的に起こっているのは、Springはそのようなコンテンツの処理をネイティブに処理する方法を知らないことであり(jspの発言かもしれません)、この構成にそれをコンテナに委任するよう指示する方法です。

47
Biju Kunjummen

さらに調査した結果、configureDefaultServletHandlingメソッドを追加せずに機能する代替ソリューションを発見しました。 build.gradleに埋め込みTomcat jspエンジンを追加する必要があります。

compile("org.Apache.Tomcat.embed:Tomcat-embed-jasper")

ConfigureDefaultServletHandlingメソッドとは対照的に、このソリューションはプレーンなhtmlだけでなくjspでも機能します。

すべてのソリューションは次の場所から入手できます。 https://github.com/driver-pete/spring-mvc-example このソリューションはマスターで利用できます。 BijuのソリューションはDefaultServletHandling_solutionブランチにあります。

13
otognan

ビューリゾルバは、Spring-Boot Webアプリケーションのapplication.propertiesファイルでも設定できます。以下のようなものです。

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
9
Piyush Upadhyay