質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

1398閲覧

Spring:Viewを解決できない

S.N.

総合スコア21

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/01/02 01:55

編集2020/01/02 01:56

非常に初歩的ながら、大変困っていますのでご助言いただければありがたいです。

やりたいこと

Spring Bootを使って、HTML画面をレンダリングしたいです。
画面は、 index.thml -> confirmation.html の順番で遷移させたいです。

環境、バージョン

  • Spring Boot : 2.2.2
  • Kotlin : 1.3.61
  • Java : 1.8.0_192-amazon-corretto-preview2-b12
  • Gradle : 6.0.1

事象

index で描画した画面から、/confirmation にPOSTでリクエスト送信、画面遷移する際に Resource Not Found となります。
リクエストの送信、画面さがす流れは次の「関連プログラム」に記載。
以下の出力を得ます。ここでは、わかりやすさのため、debug=trueにしています。

linux

12020-01-01 20:18:25.180 DEBUG 2281 --- [ restartedMain] o.s.boot.devtools.restart.Restarter : Starting application com.example.merchant.MerchantApplicationKt with URLs [file:/] 22020-01-01 20:18:33.023 INFO 2281 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 32020-01-01 20:18:33.025 INFO 2281 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 42020-01-01 20:18:33.026 DEBUG 2281 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Detected StandardServletMultipartResolver 52020-01-01 20:18:33.121 DEBUG 2281 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : enableLoggingRequestDetails='true': request parameters and headers will be shown which may lead to unsafe logging of potentially sensitive data 62020-01-01 20:18:33.121 INFO 2281 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 96 ms 72020-01-01 20:18:33.163 DEBUG 2281 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : GET "/", parameters={} 82020-01-01 20:18:33.183 DEBUG 2281 --- [nio-8080-exec-2] o.s.b.a.w.s.WelcomePageHandlerMapping : Mapped to ParameterizableViewController [view="index"] 92020-01-01 20:18:33.184 DEBUG 2281 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/", "/"] 102020-01-01 20:18:33.198 DEBUG 2281 --- [nio-8080-exec-2] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8] 112020-01-01 20:18:33.198 DEBUG 2281 --- [nio-8080-exec-2] o.s.boot.web.servlet.view.MustacheView : View name 'index', model {} 122020-01-01 20:18:33.212 DEBUG 2281 --- [nio-8080-exec-2] o.s.boot.web.servlet.view.MustacheView : Rendering [classpath:/templates/index.html] 132020-01-01 20:18:33.244 DEBUG 2281 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed 200 OK 142020-01-01 20:18:33.289 DEBUG 2281 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed 200 OK 152020-01-01 20:18:37.402 DEBUG 2281 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : POST "/confirmation", parameters={mask} 162020-01-01 20:18:37.404 DEBUG 2281 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/", "/"] 172020-01-01 20:18:37.437 DEBUG 2281 --- [nio-8080-exec-3] o.s.w.s.r.ResourceHttpRequestHandler : Resource not found 182020-01-01 20:18:37.437 DEBUG 2281 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Completed 404 NOT_FOUND 192020-01-01 20:18:37.445 DEBUG 2281 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : "ERROR" dispatch for POST "/error", parameters={mask} 202020-01-01 20:18:37.448 DEBUG 2281 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse) 212020-01-01 20:18:37.481 DEBUG 2281 --- [nio-8080-exec-3] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, text/html;q=0.8] 222020-01-01 20:18:37.481 DEBUG 2281 --- [nio-8080-exec-3] o.s.boot.web.servlet.view.MustacheView : View name 'error', model {timestamp=Wed Jan 01 20:18:37 JST 2020, status=404, error=Not Found, message=No message available, path=/confirmation} 232020-01-01 20:18:37.482 DEBUG 2281 --- [nio-8080-exec-3] o.s.boot.web.servlet.view.MustacheView : Rendering [classpath:/templates/error.html]

しかし、よくわからないのはindex.htmlと同じ階層にあるerror.htmlは探し出してくれます。
ModelAndViewの使い方が間違っているのかもしれませんが...

取り組んだこと、変更箇所

以下の変更を加え、解決を試みました。ルーティングの仕組みも非常にシンプルで、コントローラで受け取って処理の流れを考えています。
プロジェクトの雛形はSpring Initializrで作成しました。
また、ひとまず動かしたいので細かいところはいったん端折っています。

関連プログラム

application.properties:

spring.mustache.prefix=classpath:/templates/ spring.mustache.suffix=.html

MerchantWebController: Controller層

@Controller class MerchantWebController { /** * トップページの表示 */ @RequestMapping(value = ["/"], method = [RequestMethod.GET]) @Throws(Exception::class) fun index() = "index" @RequestMapping(value = ["/confirmation"], method = [RequestMethod.POST]) @Throws(Exception::class) fun confirm(model: MutableMap<String, Any>): ModelAndView { // 具体的な処理をここにいれます }

MerchantApplication.kt:
Spring Bootのエントリーポイントになるクラス、ほぼデフォルトのまま。
ServletInitializerを継承したクラスは別でいて、そのクラスもSpring Initializrで作成したzipのまま。

@SpringBootApplication @ComponentScan( "com.example.merchant.controller", "com.example.merchant.config" ) class MerchantApplication fun main(args: Array<String>) { runApplication<MerchantApplication>(*args) }

ディレクトリの階層

src main kotlin com.example.merchant controller <- ここにさっきのController config MerchantApplication ServletInitializer resources templates index.html error.html confirmation.html

その他

なにか、重大な欠点があるとかいう感じでもないか、と思っていますが、これはチェックした?とかこれ変えてみたら?等あれば
ご指摘いただければ大変ありがたいです。

どうぞ、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

テンプレートエンジンをmustacheにしていましたが、Spring Boot2系だとリソースファイルの配置を
絶妙に変更する必要があるらしく、プロジェクト作ったばかりだったのでthymeleafに変更してやり直しました。
解決です。

投稿2020/01/13 04:52

S.N.

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問