1.Spring MVC传递List类型参数报错:No primary or default constructor found for interface java.util.List]使用两种注解解决
1.1 出现场景
/**
* 对菜品进行停售或者是起售
* @param status
* @param ids
* @return
*/
@PostMapping("/status/{status}")
public R<String> status(@PathVariable("status") Integer status, List<Long> ids){
log.info("status:{}",status);
log.info("ids:{}",ids);
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(Dish::getId,ids);
List<Dish> list = dishService.list(queryWrapper);
list = list.stream().map((item)->{
item.setStatus(status);
return item;
}).collect(Collectors.toList());
dishService.updateBatchById(list);
return R.success("调整成功");
}
瑞吉外卖中对菜品进行停售或者是起售中前端向后端传入多个id数据,后端用List接收出现错误
1.2 解决方法 添加@RequestParam注解接收
1.3 原因
Spring MVC 默认将List作为对象处理,赋值前先创建对象,然后将nick作为对象的属性进行处理。
由于List是接口,无法创建对象,报无法找到构造方法异常;修复类型为可创建对象的ArrayList类型后,对象可以创建,但没有nick属性,因此数据为空。此时需要告知SpringMVC的处理器nick是一组数据,而不是一个单一数据。
通过@RequestParam注解,将数量大于1个names参数打包成参数数组后, SpringMVC才能识别该数据格式,并判定形参类型是否为数组或集合,并按数组或集合对象的形式操作数据。
1.4 RequestParam作用
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
1.5 拓展
试了下PathVariable,
1.5.1 作用
@PathVariable 映射 URL 绑定的占位符 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
@PathVariable(“xxx”) 绑定到操作方法的入参中
@RequestMapping("/getUserById/{name}")
public User getUser(@PathVariable("name") String name){
return userService.selectUser(name);
}
1.5.2 用法
1、若方法参数名称和需要绑定的url中变量名称一致时,可以简写
@RequestMapping("/getUser/{name}")
public User getUser(@PathVariable String name){
return userService.selectUser(name);
}
2、若方法参数名称和需要绑定的url中变量名称不一致时,写成
@RequestMapping("/getUserById/{name}")
public User getUser(@PathVariable("name") String userName){
return userService.selectUser(userName);
}
参考博客:
http://t.csdn.cn/sF7xP
http://t.csdn.cn/jtEk7