解決:SpringBoot2.x啓動報failed to convert java.lang.String to org.springframework.util.unit.DataSize

1.錯誤描述

  在application.yml配置文件中設置上傳大小時,使用了Mb的單位

  servlet:
    multipart:
      max-file-size: 10Mb
      max-request-size: 10Mb

  然後啓動報錯:

 

二.問題排查解決

  看提示是org.springframework.util.unit.DataSize這個配置錯誤,看了一下這個DataSize的構造函數是一個long類型的

private DataSize(long bytes) {
        this.bytes = bytes;
    }

  所有想到把max-file-size的值修改成long類型,如下:

  servlet:
    multipart:
      max-file-size: 10000000
      max-request-size: 10000000

  啓動,不再報錯。

  但是改成純數字的看起來不是那麼直觀,又去看了一下DataSize這個類,發現有一個轉化方法可以直接將字符串傳化爲long類      型,如下:

    public static DataSize parse(CharSequence text, @Nullable DataUnit defaultUnit) {
        Assert.notNull(text, "Text must not be null");

        try {
            Matcher matcher = PATTERN.matcher(text);
            Assert.state(matcher.matches(), "Does not match data size pattern");
            DataUnit unit = determineDataUnit(matcher.group(2), defaultUnit);
            long amount = Long.parseLong(matcher.group(1));
            return of(amount, unit);
        } catch (Exception var6) {
            throw new IllegalArgumentException("'" + text + "' is not a valid data size", var6);
        }
    }

    // of方法
    public static DataSize of(long amount, DataUnit unit) {
        Assert.notNull(unit, "Unit must not be null");
        return new DataSize(Math.multiplyExact(amount, unit.size().toBytes()));
    }

 其中匹配的字符串類型必須是全部大寫且長度爲2,即在寫10MB的時候,MB要全部大寫,且不能只寫成10M,MB要寫全

 最終的配置:

  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB

  再啓動,發現可以正常啓動

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章