首页 > 编程语言 >Type definition error: [array type, component type: [simple type, class java.lang.String]]; nested e

Type definition error: [array type, component type: [simple type, class java.lang.String]]; nested e

时间:2024-12-01 09:28:42浏览次数:10  
标签:lang definition String 批量 xxx ids type id

 详细报错信息:

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

相关文章

  • C++ 编程技巧之StrongType(1)
    最近看到一个NamedType的开源库,被里面的StrongType这个概念和里面的模版实现给秀了一脸,特此总结学习一下GitHub-joboccara/NamedType:ImplementationofstrongtypesinC++C++本身是一种强类型语言,类型包括int、double等这些buildin类型以及class类型,强类型的意思是......
  • LangChain大模型AI应用开发实践:从基础到实战【文末好书推荐】
    《LangChain大模型AI应用开发实践》是一个围绕使用LangChain进行大规模AI应用开发的主题,重点介绍如何通过LangChain框架和相关技术,构建和优化AI应用。LangChain是一个面向大语言模型(LLM)开发的开源框架,特别适用于与多个外部工具、API及数据源的集成。它帮助开发者通过无缝的......
  • 4. langgraph实现高级RAG (Corrective RAG)
    数据准备fromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_community.document_loadersimportWebBaseLoaderfromlangchain_community.vectorstoresimportChromaurls=["https://lilianweng.github.io/posts/2023-06-23-a......
  • 探索 TypeScript 编程的利器:ts-morph 入门与实践H6
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:贝儿背景在开发webIDE中生成代码大纲的功能时,发现自己对TypeScript的了解知之甚少,以至于针对该功能的实现没有明确的思路。究其......
  • golang: 用协程异步写日志
    一,代码1,全局文件://日志消息结构体typeLogMessagestruct{ Levelstring Messagestring}//通道varLogChanchanLogMessage//日志文件句柄varGlobalLogFile*os.File//异步日志函数funcAsyncLog(logChchanLogMessage){ for{ select{ casems......
  • auto与decltype
    auto:1.定义:在C++中, auto 是一个类型说明符,它让编译器在编译阶段自动推导变量的类型,其类型取决于初始化表达式的类型。auto 在声明变量时使用,编译器会根据变量初始化表达式自动推断类型。#include<iostream>#include<typeinfo>usingnamespacestd;intfun(){ retu......
  • 【C++】数据类型的存储范围与 typedef 的深度解析
    博客主页:[小ᶻ☡꙳ᵃⁱᵍᶜ꙳]本文专栏:C++文章目录......
  • MathType 高效使用 | 快捷键 / 设置
    注:本文为“Mathtype常用功能/公式使用技巧”系列文章合辑中的“MathType高效使用快捷键”分章重排。引用部分,未整理去重,按需检索。MathType常用快捷键一、放大或缩小尺寸类快捷键100%:Ctrl+1200%:Ctrl+2400%:Ctrl+4800%:Ctrl+8二、插入符号类快捷键小括......
  • 探索 TypeScript 编程的利器:ts-morph 入门与实践
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:贝儿背景在开发webIDE中生成代码大纲的功能时,发现自己对TypeScript的了解知之甚少,以至于针对该功能的实现没有明确的思路。究其......
  • TypeScript核心语法(3)——类型系统
    本章是TypeScript类型系统的总体介绍。TypeScript继承了JavaScript的类型,在这个基础上,定义了一套自己的类型系统。先讲一下最基础的类型,any类型。any类型​基本含义​any类型表示没有任何限制,该类型的变量可以赋予任意类型的值。letx:any;x=1;//正确x=......