赞
踩
JSON parse error: Cannot deserialize value of type `long` from String "1,2": not a valid `long` value; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `long` from String "1,2": not a valid `long` value at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 109] (through reference chain: com.ruoyi.system.domain.License["modulesName"])
在我使用ele-select多选组件的时候需要将多选信息存入数据库,因为组件传出来的是个数组,所以我采用拆成字符串的形式存入数据库,后端以String格式接收
示例:
- //多选组件发出的数组格式
- [1,2,3]
- //经过拆分拼接后可以存入数据库的字符串格式
- "1, 2, 3"
前端部分代码:
- //多选组件
- <el-form-item label="包含模块" prop="modulesName">
- <el-select v-model="form.modulesName" multiple placeholder="请选择包含模块">
- <el-option
- v-for="dict in dict.type.sys_modules_name"
- :key="dict.value"
- :label="dict.label"
- :value="parseInt(dict.value)">
- </el-option>
- </el-select>
- </el-form-item>
-
-
- //处理提交的函数
- /** 提交按钮 */
- submitForm() {
- this.$refs["form"].validate(valid => {
- if (valid) {
- const modulesNameStr = this.form.modulesName.join(",");
- const formData = {
- ...this.form,
- modulesName: modulesNameStr
- }
- if (this.form.id != null) {
- updateLicense(formData).then(response => {
- this.$modal.msgSuccess("修改成功");
- this.open = false;
- this.getList();
- });
- } else {
- addLicense(formData).then(response => {
- this.$modal.msgSuccess("新增成功");
- this.open = false;
- this.getList();
- });
- }
- }
- });
- },
后端实体类对应字段:
- /** 包含模块(字典选择,多选) */
- @Excel(name = "包含模块", readConverterExp = "字=典选择,多选")
- private String modulesName;
于是此时组件发出来的数组数据已经被我拼成了字符串,实体类对应字段也可以接收字符串,但是运行的时候还是得到了上面的报错信息(怒)
经过到处询问得到了这样一个解释:
这个报错信息的大致意思就是,此时我前端发出来的经过处理后的字符串在JSON反序列化时JSON库正在尝试将其转化为Long型(凭啥!),但是我后端的实体类对应字段是String,所以接收不到,解决办法也很简单,只要在对应字段加上注解:
@JsonFormat(shape = JsonFormat.Shape.STRING)
这样做可以将JSON反序列化时将其指定转换成字符串,就!可!以!了!
小白的我被这个问题困了一上午,我相信一定还会有其他人踩到这个坑,希望能对看到这个的同学有所帮助(大哭)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。