【Spring】controllerがFormまたはリクエストパラメータを引数として受け取る際、List型はindexの上限値がある

spring

 業務アプリの中、データ一覧を表示する機能が多く利用されると思いますが、ほとんどの場合はページング機能で1ページのデータ数を固定されます。
 しかし、時にはいろんな理由でページング機能を利用しなく、数多くのデータを1ページにスクロールで表示することがあります。この場合、注意しないと、システムエラーが発生し易いです。なぜなら、画面の方でListを利用して、そのデータをcontrollerの引数にバインドするする際、Listのindexの上限値があります。Listの項目数が256を超えますと、システムエラーが発生します。

Controller
@RequestMapping(value = "test")
public ModelAndView test(@ModelAttribute testForm form, BindingResult result) {
……
}
Form
@Data
public class testForm {
……
    private List<listItems> listItems;     ←ここのlistItemsのサイズを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);
    }
}

コメント

タイトルとURLをコピーしました