6

spring-boot プロジェクト (java -jar /path/to/war.war) を実行すると、.jsp ファイルが見つかりません。

@ResponseBody でアノテーションが付けられたメソッドは正常に機能します。ビュー リゾルバは JSP ページへの正しいパスを見つけようとしていますが、それらが見つかりません。このプロジェクトには 1 つの構成クラスがあり、web.xml はありません。

構成クラス:

@Configuration
@EnableAutoConfiguration
@EnableWebMvc
@ComponentScan (basePackages = "org.ghc.security.web")
class ScMain extends WebMvcConfigurerAdapter {


    // SpringBoot BootStrap...
    static void main (String[] args) {
        ApplicationContext ctx = SpringApplication.run (ScMain, args)

        System.out.println("Let's inspect the beans provided by Spring Boot:");

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        beanNames.each { beanName ->
            System.out.println(beanName);
        }
    }


    @Bean
    InternalResourceViewResolver internalResourceViewResolver () {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver()
        viewResolver.setPrefix("/WEB-INF/jsp/")
        viewResolver.setSuffix(".jsp")
        viewResolver
    }
}

コントローラ

@Controller
class Running {

    @RequestMapping ("/alive")  // This works fine
    @ResponseBody
    String amIAlive () {
        "ALIVE!"
    }


    @RequestMapping ("/alive/page")  // Path to page resolved, but file not found!
    ModelAndView amIAlivePage () {
        new ModelAndView("alivepage")
    }
}

エラーログ

2013-11-25 09:08:28.714 エラー 1549 --- [tp1945397783-20] org.apache.jasper.servlet.JspServlet: PWC6117: ファイル "%2FUsers%2Fnode42%2FDevelopment%2Fmock-security-ui%2Fbuild%2Flibs %2Fmock-security-ui-2.06-SNAPSHOT.war%2FWEB-INF%2Fjsp%2Falivepage.jsp" が見つかりません

ログ エントリの .war ファイルへのパスが正しく、war ファイルのパス (WEB-INF/jsp/alivepage.jsp) が正しい。Jetty を使用しても Tomcat を使用しても、応答は同じです (上記のログは Jetty からのものです)。また、ビュー リゾルバーを使用しないか、上記のように指定するか、プロパティを介してビュー リゾルバーを設定しようとしました。この小さな詳細を除いて、すべてが実際に機能しているように見えるので、私は完全に困惑しています. また、コントローラーの @ResponseBody アノテーション付きメソッドは正常に機能します。

誰かが何か提案があれば、私は確かに入力に感謝します!

4

5 に答える 5

17

私は同じ問題を抱えていましたが、私の場合、クラスパスにライブラリがないために発生しました。

Spring Boot にはデフォルトで Jasper が含まれていないため、ライブラリを明示的に含めない限り、JSP レンダリングは機能しません。

グラドルの場合:

compile("org.apache.tomcat.embed:tomcat-embed-jasper")

Maven の場合:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
于 2014-09-10T13:26:45.083 に答える
3

実行可能アーカイブの JSP はまだ Spring Boot で完全にサポートされているとは思わない (リストにある) ので、最初に a) デプロイされた WAR および/または b) 展開されたアーカイブ (または実行中のIDE から)、またはソースから実行します。それが機能するようになったら、完全な JSP サポートが追加されるのを待つ必要があるかもしれません (貢献を歓迎します) が、少なくとも機能することがわかるでしょう。展開された WAR (マッピングなし) で表示されているエラーは、何か他のことが起こっていることを示唆しています。何かを比較したい場合は、Spring Boot に JSP サンプルがあることに注意してください。ある程度までは機能します (JSP は解決されてレンダリングされます)。

編集:Spring taglibs、JSTL、および EL サポートは、上記のサンプルで機能しているようです。更新してJSTLを追加し、IDEから実行可能なWARとしてテストしました。

于 2013-11-26T07:49:56.350 に答える
2

Bean の定義を少し修正することで、この問題を解決しました。

@Bean
    InternalResourceViewResolver internalResourceViewResolver () {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver()
        viewResolver.setPrefix("WEB-INF/jsp/")
        viewResolver.setSuffix(".jsp")
        return viewResolver;
    }
于 2016-06-09T00:56:27.347 に答える
0

あなたの pom.xml はわかりませんが、これはこのスレッドに似ているようです

Spring Boot Web アプリケーションで JSP ファイルがレンダリングされない

依存関係リストを pom に追加してみてください。

于 2014-08-26T08:11:03.180 に答える