Spring MVC @RequestParam-空列表vs空

时间:2018-08-03 19:41:10

标签: spring-mvc

默认情况下,Spring MVC假定需要@RequestParam。考虑这种方法(在Kotlin中):

fun myMethod(@RequestParam list: List<String>) { ... }

从javaScript传递空列表时,我们将调用类似以下内容的

$.post("myMethod", {list: []}, ...)

但是,在这种情况下,由于列表为空,因此无法序列化空列表,因此该参数实际上消失了,因此不满足所需参数的条件。人们被迫在required: false注释上使用@RequestParam。那不好,因为我们将永远不会收到空列表,而是空的。

是否有一种方法可以强制Spring MVC在这种情况下始终假定为空列表,而不是null

4 个答案:

答案 0 :(得分:2)

可以使用ObjectMapper进行序列化管理。如果您在Spring MVC中使用杰克逊,则可以执行以下任一操作。

  • 配置对象映射器。
   objectMapper.configure(SerializationConfig.Feature.WRITE_EMPTY_JSON_ARRAYS, false);
 
  • 或者如果您通过xml配置使用bean。 <bean name="objectMapper" class="org.springframework.http.converter.json.JacksonObjectMapperFactoryBean" autowire="no"> <property name="featuresToDisable"> <list> <value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_EMPTY_JSON_ARRAYS</value> </list> </property>

答案 1 :(得分:1)

要让Spring为您提供一个空列表而不是null,请将默认值设置为空字符串:

@RequestParam(required = false, defaultValue = "")

答案 2 :(得分:0)

尝试过吗?

missing

答案 3 :(得分:0)

您可以在控制器中尝试使用WebDataBinder。

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(List.class, "list", new CustomCollectionEditor( List.class, true));
}