状态码:400,请求方法不跳转后台控制层?原来是构造方法导致类型对不上,快速将Map类型转化为实体类实现对象的赋值

本文探讨了在使用Ajax进行前后端数据交互时遇到的常见问题,特别是针对实体类字段类型不匹配导致的错误。通过分析具体的代码示例,提出了使用Map容器接收数据并转化为实体类的解决方案,有效避免了因变量类型问题引发的异常。

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

有没有遇到过这样的情况:

在这里插入图片描述
这样的?为什么,找不到对应的路径?一下展示对应的前台的Ajax请求的方法,说一下这里要实现的功能,添加和更新的功能使用的是同一个页面,如果是更新就调用 submit_update函数,如果是添加就调用submit_add函数,两个函数的写法几乎一致,

function submit(data) {
    if (datasourceId!="null") {
        return submit_update(data);
    } else {
        return submit_add(data);
    }
}

function submit_add(data) {
    //let loadIndex = layer.load();
    $.ajax({
        url: root()+"/datasource/add",
        async: false,
        data: data.field,
        success: function (res) {
            if (res == '1') {
                layer.alert("添加成功");
                $('#btn_submit_addDb').hide();
            } else {
                layer.alert("添加失败");
            }

        }, fail: function () {
            layer.alert("请求出错");
        }
    })//.done(() => layer.close(loadIndex));
    return false;
}

function submit_update(data) {
    let loadIndex = layer.load();
    $.ajax({
        url: root()+"/datasource/update?id=" + datasourceId,
        type: "POST",
        data: data.field,
        success: function (res) {
            if (res >= '1') {
                layer.alert("更新成功");
                $('#btn_submit_addDb').hide();
            } else {
                layer.alert("更新失败");
            }

        }, fail: function () {
            layer.alert("请求出错");
        }
    }).done(() => layer.close(loadIndex));
    return false;
}

再来看看后台的Controller层的接收客户端请求的代码

@RequestMapping(value = "/add")
	public Object addDataSource(HttpServletRequest request, DataSource1 dataSource) {
		if (dataSource != null) {
			User user = (User) request.getSession().getAttribute("user");
			dataSource.setCreator(user.getUserid());
			dataSource.setCreate_time(new Date());
			dataSource.setEnable(false);
			return dataSourceService.add(dataSource);
		}
		return 0;
	}

	@RequestMapping(value = "/update")
	public Object updateDataSource(DataSource1 dataSource) {
		DataSource1 datasourceFromDb = dataSourceService.queryById(dataSource.getId());
		if (datasourceFromDb != null) {
			return dataSourceService.update(dataSource);
		}
		return 0;
	}

仿佛也没有什么的问题,但是问题就出现在请求的方法体中,这个实体类在请求时,自动new一个对象,并且为之赋前台传回来的值,如果是更新,那就意味着键值id存在并且基本的字段都不为空,但是使用的是新增的功能的时候就会遇到,这个对象有一些字段为空,但是前端的代码中,变量为弱类型,前台的id字段默认填充了“null",这就是导致一切问题的源头,实体类中的id字段为int类型,所以导致实体类创建不成功
在这里插入图片描述
有一种方法就是限定变量类型,但是对于前端的原本都喜欢var一个不限定类型的变量,所以就不采取这种办法,采取一个更简单的办法,使用Map容器接收前台传递的值,然后在将Map转化为相应的实体类,可以快速的创建对象赋值。

@RequestMapping(value = "/dbList")
	public Object getDbList(@RequestParam Map<String, String> params) {
		//将Map类型转化为实体类对象
		DataSource1 dataSource = JSON.parseObject(JSON.toJSONString(params), DataSource1.class);
		List<Map<String, Object>> list;
		try {
			list = dataSourceService.dbList(dataSource);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return list;
	}

这里导入相应的jar包
可以添加相应的Maven依赖

<dependency>
   <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.54</version>
</dependency>

也可以直接下载相应的jar包,放在工程目录下。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Outlier9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值