有没有遇到过这样的情况:
这样的?为什么,找不到对应的路径?一下展示对应的前台的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包,放在工程目录下。