springMVC:前端传的布尔类型参数只能true/false?

1,004 阅读1分钟

当 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 之类的。

那就是这些了,算是一个骚操作吧。