详细报错信息:
Type definition error: [array type, component type: [simple type, class java.lang.String]]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.lang.String[]`: no String-argument constructor/factory method to deserialize from String value ('1a6e48733e069f67f52bca67b861f234') at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 8] (through reference chain: com.hbzz.ddc.admin.pojo.form.IssueExaminesForm["ids"])
页面报错截图:
首先记录一下业务类型,这是一个批量下发功能,点击下发按钮弹窗完善下发情况,除了要批量操作的业务id,还要改每一条的状态和加备注;
其实这里可以参考删除/批量删除业务,
删除 传id
批量删除 传id数组
前端对删除和批量删除按钮是用的同一个方法,只是入参可以接受单条和数组而已:
//删除
del(row) {
const ids=row.id||this.ids
this.$modal.confirm('是否确认删除,编号为"' + ids + '"的数据项?').then(function() {
return delete(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("操作成功");
}).catch(() => {});
},
后端:
/**
* 删除冰淇淋档案
*/
@PreAuthorize("@ss.hasPermi('ddc:brands:remove')")
@Log(title = "冰淇淋档案", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable String[] ids) {
return toAjax(xxxService.delete(ids));
}
这里虽然业务如同删除/批量删除一样,但这里不能像删除功能那样直接传id/ids所以后端用一个对象XXXForm来接参,在里面定义:这三个参数:
/** 下发标题 */String mainrisk;
/** 备注 */ String remark;
/** 业务IDs */ String [] ids; //注意这里用的数组来接收批量操作的业务id
控制器:
/**
* 批量业务
*/
@PreAuthorize("@ss.hasPermi('xxx:xxx:xxx')")
@Log(title = "批量业务", businessType = BusinessType.UPDATE)
@PostMapping("/issuance")
public AjaxResult issuance(@RequestBody XXXForm xxxForm)
{
return toAjax(xxxService.issuance(xxxForm));
}
然后前端的data里面定义表单参数:
data() {
return {
// 是否显示弹出层
open: false,
// 表单参数
formData: {
ids:[],
mainriskno: null,
remark: null
},
// 表单校验
rules: {}
};
},
show方法和提交按钮如下,这里进页面时就先走reset方法重置表单,然后把获取的ids取出来,给响应式变量里的数据ids:[]赋值
methods: {
//打开dialog 初始化数据
show: function (ids) {
this.open = true;
this.reset();
this.formData.ids = ids;
},
然后在提交时用data就收刚刚的入参,再调下发方法把data丢进去,调后端接口
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
const data= this.formData;
this.$modal.confirm('是否确定下发冰淇淋?').then(function() {
return 接口下发方法(data);
}).then(() => {
this.open = false;
this.$parent.getList();
this.$modal.msgSuccess("出单成功");
}).catch(() => {});
然后这里批量执行没有问题,后端正常接收到数组,Arrays.asList把String [] ids转List后updateBatchById(ldList)查询,list.stream().forEach校验domain合法性后改字段状态、赋值,然后一股脑丢给updateBatchById就完了后端非常简单;
但执行单条操作时报错了,如下
Type definition error: [array type, component type: [simple type, class java.lang.String]]; nested exception is com.xxx.xxx.xxx.xxxException: Cannot construct instance of `java.lang.String[]`: no String-argument constructor/factory method to deserialize from String value ('1a6e48733e069f67f09uy61f234') at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 8] (through reference chain: xxx.xxx.xxxForm["ids"])
大致意思是`java.lang.String[]`: 要转为String类型的 value , 发生了异常,所以这里去打印一下单选和批量的按钮,传给后端的id/ids类型到底是啥
console.log(typeof ids);
这里可以看到,批量传的是数组打印出类型是object而单条是string,所以这里有两点注意:
1.要么不能像delete那样id和ids混着传,因为后端在对象里面的属性是固定的一种类型
2.要么统一传id或ids,在后端进行处理
这里可以传ids数组到后端,单选时一个字符串就创建数组丢进去,后端依旧用数组接收
//打开dialog 初始化数据
show: function (ids) {
console.log(typeof ids);
if(typeof ids=='string'){
this.formData.ids=[ids];
}else{
this.formData.ids=ids;
}
也可以直接传,后端对象接参时把属性设置为String即可
@Data
public class XxxxForm {
/**
* IDs
*/
private String ids;
/**
* XXX号
*/
private String mainriskno;
/**
* 备注
*/
private String remark;
}
然后用split(",")获取对象的数组再Arrays.asList(ids)即可
标签:lang,definition,String,批量,xxx,ids,type,id From: https://blog.csdn.net/SSHLY3/article/details/143976530