解决: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

  再启动,发现可以正常启动


版权声明:本文为guocunlei25原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。