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
再启动,发现可以正常启动