非常に初歩的ながら、大変困っていますのでご助言いただければありがたいです。
やりたいこと
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
その他
なにか、重大な欠点があるとかいう感じでもないか、と思っていますが、これはチェックした?とかこれ変えてみたら?等あれば
ご指摘いただければ大変ありがたいです。
どうぞ、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。