Java Map返回Postman时空字符串值丢失问题排查
Spring Boot接口返回Map时丢失空字符串值条目
调试时确认Map<String, String>包含带空字符串值的条目,但通过GET接口返回给Postman时,这些空值条目未被返回,仅收到非空值条目。
接口代码
@GetMapping(value = Routes.URI_SUFFIX_DATA_ZIPCODES_BY_CITY_AND_ZIPCODE, produces = {MediaType.APPLICATION_JSON_VALUE}) @RegisterMetricCallReceived(appService = "getStreetsByCityAndZipCode", version = "v1", type = TYPE_REST) public Map<String,String> getStreetsByCityAndZipCode(HttpServletRequest request, @RequestParam(name = "city") String city, @RequestParam(name = "zipcode") String zipcode) { GetStreetByCityAndZipcode query = new GetStreetByCityAndZipcode(); query.setCity(city); query.setZipcode(zipcode); Map<String, String> result = service.getStreets("eligibility", query).orElse(null); return result; }
调试时的Map内容
"PLACE DU PRIEURE" -> "01043406" "ROUTE DE BIERNE" -> "" "ROUTE DE GENNES SUR GLAIZE" -> "01043405" "RUE COURTE" -> "01043399" "RUE D ANJOU" -> "01043398" "RUE DE GENNES" -> "04311435" "RUE DE L EGLISE" -> "01043397" "RUE DE LA CHENAIE" -> "04106244" "RUE DE LA POSTE" -> "01043400" "RUE DES GRANDS JARDINS" -> "01043401" "RUE DES JARDINS" -> "" "RUE DES SPORTS" -> "04415887"
Postman收到的内容
"PLACE DU PRIEURE" -> "01043406" "ROUTE DE GENNES SUR GLAIZE" -> "01043405" "RUE COURTE" -> "01043399" "RUE D ANJOU" -> "01043398" "RUE DE GENNES" -> "04311435" "RUE DE L EGLISE" -> "01043397" "RUE DE LA CHENAIE" -> "04106244" "RUE DE LA POSTE" -> "01043400" "RUE DES GRANDS JARDINS" -> "01043401" "RUE DES SPORTS" -> "04415887"
解决方案
问题根源是Spring Boot默认使用的Jackson序列化框架可能配置了排除空值/空字符串的规则,导致带空字符串值的Map条目被过滤。可以通过以下方式解决:
1. 全局配置Jackson保留所有值
在application.properties中添加配置:
spring.jackson.default-property-inclusion=ALWAYS
如果使用application.yml则配置:
spring: jackson: default-property-inclusion: ALWAYS
该配置会让Jackson序列化所有属性,包括空字符串、null值等,不会过滤带空字符串的Map条目。
2. 局部配置接口方法
直接在返回Map的接口方法上添加@JsonInclude注解,指定序列化规则:
@JsonInclude(JsonInclude.Include.ALWAYS) @GetMapping(...) public Map<String,String> getStreetsByCityAndZipCode(...) { // 方法逻辑不变 }
这种方式仅对当前接口生效,不会影响全局配置。
3. 检查自定义Jackson配置
如果项目中有自定义的Jackson配置类(比如继承WebMvcConfigurer并重写configureMessageConverters方法),需检查是否设置了SerializationFeature.WRITE_NULL_MAP_VALUES或JsonInclude相关规则,调整为允许空字符串值的序列化。
内容的提问来源于stack exchange,提问作者Wijdane KHATTAT
相关产品推荐
相关产品推荐

