Spring无法将JSON数组转为DTO中List<Long>,请求排查解决
Spring默认依赖Jackson作为JSON处理工具,完全支持将JSON中的元素列表转换为DTO中的List<Long>类型,以下是常见错误点及排查方案:
常见错误排查
DTO字段定义错误
检查DTO中的字段是否明确声明为List<Long>,而非List<String>或其他类型;确保字段有对应的getter/setter方法(可通过Lombok的@Data注解自动生成);如果JSON键名和DTO字段名不一致,需添加@JsonProperty("json_key_name")指定映射关系。JSON格式不匹配
确认请求的JSON列表是数字数组,例如:{"targetIds": [123, 456, 789]}若JSON中是字符串数组(如
["123","456"]),Jackson默认不会自动将字符串转Long,此时要么修改JSON格式为数字数组,要么在DTO字段上添加自定义反序列化器,或者后续手动转换。请求头配置错误
确保请求的Content-Type设置为application/json,如果使用form-data或x-www-form-urlencoded格式,Spring无法正确解析JSON结构,会导致转换失败。Jackson自定义配置冲突
若项目中自定义了ObjectMapper配置,检查是否禁用了数字类型自动转换,比如设置了disable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS)等可能影响类型转换的配置,需调整配置保留默认的数字到Long的转换逻辑。嵌套对象结构错误
如果List<Long>是嵌套在多层对象中的,需确保DTO的层级结构和JSON完全对应,没有遗漏或多余的层级。
正确示例
DTO定义
import lombok.Data; import java.util.List; @Data public class IdListDTO { // 若JSON键名为"ids",字段名一致则无需额外注解 private List<Long> ids; }
控制器方法
@RestController @RequestMapping("/api") public class TestController { @PostMapping("/receive-ids") public String receiveIds(@RequestBody IdListDTO dto) { return "接收的ID列表:" + dto.getIds().toString(); } }
合法请求JSON
{ "ids": [1001, 2002, 3003] }
内容的提问来源于stack exchange,提问作者Макс Тимощенко

