最近在学习springcloud,在进行springboot拆分成springcloud项目的时候,我使用feign来进行微服务的调用,遇到了一些坑,特此总结,谨记
单个参数的传值有两种方式,第一种
使用@RequestParam/@PathVariable
进行传值
客户端feign调用接口(@RequestParam
)
@RequestMapping("/ct/selectOne")
Customer selectOne(@RequestParam("id") Integer id);
服务提供端
@RequestMapping("selectOne")
public Customer selectOne(Integer id) {
return this.customerService.queryById(id);
}
客户端feign调用接口(@PathVariable
)
@GetMapping("/admin/selectOne/{id}")
String selectOne(@PathVariable("id") Integer id);
服务提供端
@RequestMapping("selectOne/{id}")
@HystrixCommand(fallbackMethod = "HystrixqueryById")
public Admin selectOne(@PathVariable("id") Integer id) {
Admin bean = adminService.queryById(id);
if(bean == null){
throw new RuntimeException("id:"+id+"没有找到该id的用户");
}
return bean;
}
注意:
多个参数的传值可以使用多个@RequestParam来进行传参
客户端feign调用接口
@RequestMapping("/ct/upload")
Customer upload(@RequestParam("newFileName") String newFileName,
@RequestParam("id") int id);
服务提供端
@RequestMapping("upload")
public Customer upload(String newFileName,int id) throws IOException {
System.out.println("进入提供者-图片上传");
//设置图片上传路径,是目标文件夹的路径
// 保存到数据库
Customer customer=customerService.queryById(id);
customer.setImage(newFileName);
customerService.update(customer);
return customer;
}
传对象有两种方式
第一种,使用@SpringQueryMap
注解实现
客户端feign调用接口
@RequestMapping("/ev/insert")
Evaluation insert(@SpringQueryMap Evaluation evaluation);
服务提供端
@RequestMapping("insert")
public Evaluation insert(Evaluation evaluation) {
return evaluationService.insert(evaluation);
}
第二种,使用@RequestBody
传递参数
@RequestMapping(value = "/admin/save", method = RequestMethod.POST)
Object save(@RequestBody Admin admin);
服务提供端
@PostMapping("save")
public Object save(@RequestBody Admin admin){
boolean result = false;
//判断是添加还是编辑
if(admin.getId()!=null){
//编辑
// System.out.println("编辑管理员信息");
result = adminService.update(admin)>0;
} else {
//添加
admin.setRegDate(new Date());
// System.out.println("添加管理员信息"+admin);
result = adminService.insert(admin).getId() != null;
}
return result;
}
亲测踩坑 使用@RequestParam+@RequestBody的时候,出现问题
@RequestBody
要求前端页面返回json格式,否则会报:不支持Content-Type:application/json的错误
解决办法:
扩展参考:Spring Cloud FeignClient 自定义复杂对象参数解析
https://www.leftso.com/article/2408062037179947.html