Springboot同时接收前端传来的字符串、对象数组和文件

本文讲述了如何在SpringMVC中处理包含文件和对象数组的ArticleCreateDTO,包括前端转换为字符串、后端解析和使用Fastjson。作者分享了一种相对简洁的解决方法,以避免415错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题提出

传的数据格式如下:

article = {
    title: '字符串',
    content: '字符串',
    sectionId: 1,
    file: (文件),
    tags: [{tagId: 1, tagName: "qwe"}, {tagId: 2, tagName: "asd"}...]
}

最初, 后端准备直接用一个DTO来接收:

@RequestMapping(value = "/", method = RequestMethod.POST)
    public ResponseEntity<SingleKeyVO> createArticle(ArticleCreateDTO articleDTO)
        

ArticleCreateDTO:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArticleCreateDTO implements Serializable {
​
    /**
     * 作者的id
     */
    @JsonProperty("authorId")
    private Integer authorId;
​
    /**
     * Article-文章Id
     */
    @JsonProperty("articleId")
    private String articleId;
​
    /**
     * Article-文章标题
     */
    @JsonProperty("title")
    private String title;
​
    /**
     * Article-文章内容
     */
    @JsonProperty("content")
    private String content;
​
    /**
     * 文章封面图片
     */
    @JsonProperty("file")
    MultipartFile file;
​
    /**
     * 文章分区id
     */
    @JsonProperty("sectionId")
    private Integer sectionId;
​
    /**
     * Tag-文章标签
     */
    @JsonProperty("tags")
    private List<TagIdAndNameVO> tags;

TagIdAndNameVO:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TagIdAndNameVO implements TagVO, Serializable {
​
    @JsonProperty("tagId")
    private String tagId;
    @JsonProperty("tagName")
    private String tagName;
}

然而SpringMVC并不能解析其中的对象数组(tags),将List<TagIdAndNameVO> 改为 TagIdAndNameVO[] 也无效,所以开始寻求解决方法...

第一个找到的方法时在控制器方法的DTO形参处加@RequestBody注解:

@RequestMapping(value = "/", method = RequestMethod.POST)
    public ResponseEntity<SingleKeyVO> createArticle(@RequestBody ArticleCreateDTO articleDTO)

此时会返回状态码415,原因是前端传来的数据中包含文件。所以将 content-type 改为了 multipart/form-data,但@RequestBody 注解不支持该类型,所以也行不通...

问题解决

后来又看到一位网友说可以先将对象数组转为字符串,后端再通过工具将字符串转为List, 操作如下:

1、前端先将数组转为字符串

let data = new FormData()
data.append("title", topic.title)
data.append("file", topic.file)
data.append("content", topic.content)
data.append("sectionId", topic.sectionId)
// 使用JSON.stringify 方法
data.append("tags", JSON.stringify(topic.tags))
// 注:传给后端的数据包含文件时,需要使用FormData() 否则文件无法传递到后端(前端知识浅薄,不一定对)

2、再修改后端DTO(其他的不变,将tags 改为String 类型即可)

public class ArticleCreateDTO implements Serializable {
​
    /**
     * Tag-文章标签
     */
    @JsonProperty("tags")
    private String tags;
}

3、使用fastjson 将 String 转为List

List<TagIdAndNameVO> tagList = JSON.parseArray(articleCreateDTO.getTags(), TagIdAndNameVO.class);

至此,问题解决,但解决方式仍不够“优雅”,还需要继续学习...

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值