当 content-type 为 application/x-www-form-urlencoded 、 multipart/form-data 时,前端传的Boolean类型的参数一般为 true 或 false。但是其实当后端 springMVC 接收参数时,它是可以支持四种方式来表示 boolean 类型参数的,这四种形式分别是 true / false 、on / off 、yes / no 、 1 / 0 。springMVC 把参数传到 controller 中的方法时,需要对参数进行解析,因为http协议传过来的其实就是一堆字符串,经过 Tomcat 把它们处理成 键值对的形式,然后 springMVC 再根据你 controller 方法中定义的 参数类型,把字符串转成对应的类型。
而从 Sting 转成 Boolean 就需要使用 StringToBooleanConverter 这个转换器, 代码如下
package org.springframework.core.convert.support;
import java.util.HashSet;
import java.util.Set;
import org.springframework.core.convert.converter.Converter;
import org.springframework.lang.Nullable;
final class StringToBooleanConverter implements Converter<String, Boolean> {
private static final Set<String> trueValues = new HashSet<>(8);
private static final Set<String> falseValues = new HashSet<>(8);
static {
trueValues.add("true");
trueValues.add("on");
trueValues.add("yes");
trueValues.add("1");
falseValues.add("false");
falseValues.add("off");
falseValues.add("no");
falseValues.add("0");
}
@Override
@Nullable
public Boolean convert(String source) {
String value = source.trim();
if (value.isEmpty()) {
return null;
}
value = value.toLowerCase();
if (trueValues.contains(value)) {
return Boolean.TRUE;
}
else if (falseValues.contains(value)) {
return Boolean.FALSE;
}
else {
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
}
从上面的代码 convert 方法可以看到,它还会先把参数转为小写,所以它不仅支持四种格式,而且还不区分大小。
上面的提到的 content-type 并没有 application/json ,所以它不适用于解析json格式的 boolean 参数,而解析json 底层使用的就是 Jackson 的 ObjectMapper 了,或者自定义为 Fastjson 之类的。
那就是这些了,算是一个骚操作吧。