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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

Q&A

解決済

1回答

4949閲覧

spring boot ファイルサイズに対するvalidation

encho

総合スコア182

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

1グッド

0クリップ

投稿2020/03/22 08:50

編集2020/03/22 10:19

##やりたいこと
Spring Bootのバリデーション についてです。
ファイルアップロード時に1MBを超えたファイルに関しては
バリデーション でエラーメッセージを表示しようとしています。

##現状
1MB以上のファイルをアップロードするとバリデーション ではなく
以下のエラーが発生。
エラーの意味は理解しているがバリデーション が働かない理由がわからない
なにかアドバイスをいただけると幸いです。
よろしくお願いいたします。

##エラー

error

1org.springframework.web.util.NestedServletException: 2Request processing failed; nested exception is org.springframework.web.multipart.MaxUploadSizeExceededException: 3Maximum upload size exceeded; 4nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: 5The field uploadFile exceeds its maximum permitted size of 1048576 bytes.

##バリデーション

java

1@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) 2@Retention(RetentionPolicy.RUNTIME) 3@Constraint(validatedBy = UploadFileMaxSizeValidator.class) 4public @interface UploadFileMaxSize { 5 String message() default "{spring.app.profile.validation.UploadFileNotEmpty.message}"; 6 long value() default (1024 * 1024); 7 Class<?>[] groups() default {}; 8 Class<? extends Payload>[] payload() default {}; 9 10 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) 11 @Retention(RetentionPolicy.RUNTIME) 12 @Documented 13 @interface List { 14 UploadFileMaxSize[] value(); 15 } 16 17}

java

1public class UploadFileMaxSizeValidator implements 2ConstraintValidator<UploadFileMaxSize, MultipartFile> { 3 4private UploadFileMaxSize constraint; 5 6@Override 7public void initialize(UploadFileMaxSize constraint) { 8 this.constraint = constraint; 9} 10 11@Override 12public boolean isValid(MultipartFile multipartFile, 13 ConstraintValidatorContext context) { 14 if (constraint.value() < 0 || multipartFile == null) { 15 return true; 16 } 17 return multipartFile.getSize() <= constraint.value(); 18} 19 20}

##Formクラス @FileRequiredは問題なく働く

java

1public class FileUploadForm 2{ 3 @FileRequired(message="ファイルを選択して下さい") 4 @UploadFileNotEmpty(message="ファイルが空です。") 5 @UploadFileMaxSize(message="1MB以下のファイルを選択してください") 6 private MultipartFile uploadFile; 7 8 public MultipartFile getUploadFile() 9 { 10 return uploadFile; 11 } 12 13 public void setUploadFile(MultipartFile uploadFile) 14 { 15 this.uploadFile = uploadFile; 16 } 17}

##Controllerクラス

java

1//プロフィール画像をアップロード 2 @PostMapping("upload") 3 public String upload(@Validated FileUploadForm fileUploadModel, 4 BindingResult bindingResult, 5 @AuthenticationPrincipal LoginUserDetails userDetails, 6 Model model){ 7 if(bindingResult.hasErrors()) { 8 return showProfileEdit(model); 9 } 10 User user = userDetails.getUser(); 11 int userId = user.getUserId(); 12 String path = String.valueOf(userId); 13 user.setProfileImage(path); 14 userRepository.save(user); 15 s3UploadHelper.saveImage(userId,fileUploadModel.getUploadFile()); 16 return "redirect:profile/edit"; 17 }
yyyyssss👍を押しています

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

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

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

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

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

m.ts10806

2020/03/22 09:50

問題・課題がハッキリしているのでしたらタイトルはもう少し工夫された方が良いのでは。
encho

2020/03/22 10:19

すみません。修正しました。
guest

回答1

0

自己解決

・そもそもMaxUploadSizeExceededExceptionはvalidationで処理できないようです。
validationは値チェックなので例外処理ではありません。
なのでバリデーション ではなく例外処理として対処しました。

元々のファイルアップロードの上限がバリデーション に関係なく1MBで設定しているため
そこで例外が発生。バリデーション 処理へとはならなかったみたいです。

バリデーション で処理をしたいなら設定値を上げたら例外は起こらないはずなので
バリデーション で対処できるかもしれません。
ただ元の設定値上げたら元も子もないと思ったので今回は例外処理で対処しました。

投稿2020/03/23 02:55

encho

総合スコア182

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問