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

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

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

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

Spring Boot

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

解決済

Spring Bootでbindingに失敗する

KentaNakamoto
KentaNakamoto

総合スコア23

Kotlin

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

Spring Boot

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

1回答

0リアクション

0クリップ

1740閲覧

投稿2021/08/10 01:56

前提・実現したいこと

Spring Boot(kotlin)で、ファイルをアップロードするアプリを作成中です。
spring initializrでひな形を作成した後、Qiitaのこのサイトをもとにプログラムを作成したところ、ページ自体は無事に開けたのですが、「送信する」ボタンを押すとエラーが生じました。

発生している問題・エラーメッセージ

@GetMapping("/")ではエラーが生じませんでしたが、@PostMapping("/upload")で以下のようなエラーが生じました。bindingでこけているようです。

org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputFileFieldTagProcessor' (template: "index" - line 11, col 12) at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:117) ~[thymeleaf-3.0.12.RELEASE.jar:3.0.12.RELEASE] <以下略> Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'updateForm' available as request attribute at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:153) ~[spring-webmvc-5.3.9.jar:5.3.9] <以下略> 2021-08-10 10:13:47.582 ERROR 19072 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputFileFieldTagProcessor' (template: "index" - line 11, col 12)] with root cause java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'updateForm' available as request attribute at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:153) ~[spring-webmvc-5.3.9.jar:5.3.9] at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903) ~[spring-webmvc-5.3.9.jar:5.3.9] <以下略>

該当のソースコード

kotlin

**HomeController** import org.springframework.stereotype.Controller import org.springframework.ui.Model import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.multipart.MultipartFile import java.io.IOException import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.nio.file.StandardOpenOption import java.time.LocalDateTime import java.time.format.DateTimeFormatter @Controller class FileUploadController { private fun getExtension(filename: String?): String { val dot = filename!!.lastIndexOf(".") return if (dot > 0) { filename.substring(dot).toLowerCase() } else "" } private fun getUploadFileName(fileName: String?): String { return (fileName + "_" + DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS") .format(LocalDateTime.now()) + getExtension(fileName)) } private fun createDirectory() { val path: Path = Paths.get("C:/upload/files") if (!Files.exists(path)) { try { Files.createDirectory(path) } catch (e: Exception) { //エラー処理は省略 } } } private fun savefile(file: MultipartFile) { val filename = getUploadFileName(file.originalFilename) val uploadfile: Path = Paths.get("C:/upload/files/$filename") try { Files.newOutputStream(uploadfile, StandardOpenOption.CREATE).use { os -> val bytes = file.bytes os.write(bytes) } } catch (e: IOException) { //エラー処理は省略 } } private fun savefiles(multipartFiles: List<MultipartFile>) { createDirectory() for (file in multipartFiles) { savefile(file) } } @GetMapping("/") fun uploadview(model: Model): String { model.addAttribute("updateForm", UploadForm()) return "index" } @PostMapping("/upload") fun upload(model: Model?, form: UploadForm): String { if (form.file == null || form.file.isEmpty()) { //エラー処理は省略 return "index" } savefiles(form.file) return "redirect:/" } }

kotlin

**UploadForm** import org.springframework.web.multipart.MultipartFile class UploadForm { val file: List<MultipartFile>? = null }

html

**index.html** <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>top page</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <h2>ファイルアップロード</h2> <form method="post" th:action="@{/upload}" th:object="${updateForm}" > <input th:field="*{file}" type="file" multiple/> <input type="submit" value="送信する"/> </form> </body> </html>
**Gradle** import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "2.6.0-M1" id("io.spring.dependency-management") version "1.0.11.RELEASE" kotlin("jvm") version "1.5.21" kotlin("plugin.spring") version "1.5.21" } group = "com.example" version = "0.0.1-SNAPSHOT" java.sourceCompatibility = JavaVersion.VERSION_11 repositories { mavenCentral() maven { url = uri("https://repo.spring.io/milestone") } } dependencies { implementation("org.springframework.boot:spring-boot-starter-thymeleaf") implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") testImplementation("org.springframework.boot:spring-boot-starter-test") implementation("org.springframework.boot:spring-boot-starter-validation") //implementation("org.springframework.boot:spring-boot-starter-jdbc") //implementation ("org.springframework.boot:spring-boot-starter-data-jpa") } tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = "11" } } tasks.withType<Test> { useJUnitPlatform() }

試したこと

ファイルアップロード時のbindingでこけているようでしたので、<input th:field="*{file}" type="file" multiple/>から<input th:field="*{file}" type="text"/>に変えてみましたが、同じエラーがでました。以上より、@PostMappingのコードの書き方がおかしいのでは?と思っていますが、どのようにおかしいのかわかりません。

補足情報(FW/ツールのバージョンなど)

Spring Boot 2.6.0-M1
Java SDK 14.0.1

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Kotlin

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

Spring Boot

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