業務アプリの中、データ一覧を表示する機能が多く利用されると思いますが、ほとんどの場合はページング機能で1ページのデータ数を固定されます。
しかし、時にはいろんな理由でページング機能を利用しなく、数多くのデータを1ページにスクロールで表示することがあります。この場合、注意しないと、システムエラーが発生し易いです。なぜなら、画面の方でListを利用して、そのデータをcontrollerの引数にバインドするする際、Listのindexの上限値があります。Listの項目数が256を超えますと、システムエラーが発生します。
こんなエラーが発生します。
16:34:42.536 ERROR [d0ea213fd77949dfaf0c5c200be9ea68] handler.GlobalExceptionResolver.resolveException#69 - org.springframework.beans.InvalidPropertyException: Invalid property 'listItems[256]' of bean class [***.controller.test.form.testForm]: Index of out of bounds in property path 'listItems[256]'; nested exception is java.lang.IndexOutOfBoundsException: Index 256 out of bounds for length 256
[StackTrace-start]
org.springframework.beans.InvalidPropertyException: Invalid property 'listItems[256]' of bean class [***.controller.test.form.testForm]: Index of out of bounds in property path 'listItems[256]'; nested exception is java.lang.IndexOutOfBoundsException: Index 256 out of bounds for length 256
at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:700)
原因
Springフレームワークのソースコードは下記のようになり、デフォルトでcontrollerの引数がデータバインドのListなどのコレクションの上限サイズは256となります。
対策:上限値の拡張
Controllerに下記のソースコードを追加すると、Controllerが実行する最初に下記の上限値の拡張処理が呼ばれます。
@InitBinder
public void configureWebDataBinder(WebDataBinder binder){
binder.setAutoGrowCollectionLimit(512);
}
その他の対策:JSONObjectで引数を受け取る
@RestController
@RequestMapping("/controller")
public class Controller {
//改修前
@PostMapping("/addModel")
public AjaxResult addModel(Model model){
//.........
}
//改修後
@PostMapping("/addModel")
public AjaxResult addModel(JSONObject json){
//.........
Model model = JSONObject.parseObject(json.toJSONString(),Model.class);
}
}
コメント