服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - springcloud feign调其他微服务时参数是对象的问题

springcloud feign调其他微服务时参数是对象的问题

2022-09-26 13:40FOR EVER Java教程

这篇文章主要介绍了springcloud feign调其他微服务时参数是对象的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

在使用feign调用其它服务时,发现获取的参数是null,当参数是对象是,是执行的Post请求,所以要在方法参数前加@RequestBody,

@RequestBody

处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。

  • GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
  • POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

GET请求多参数的URL

假设我们请求的URL包含多个参数,例如http://microservice-provider-user/get?id=1&username=张三 ,要怎么办呢?

我们知道Spring Cloud为Feign添加了Spring MVC的注解支持,那么我们不妨按照Spring MVC的写法尝试一下:

?
1
2
3
4
5
@FeignClient("microservice-provider-user")
public interface UserFeignClient {
  @RequestMapping(value = "/get", method = RequestMethod.GET)
  public User get0(User user);
}

然而我们测试时会发现该写法不正确,我们将会收到类似以下的异常:

feign.FeignException: status 405 reading UserFeignClient#get0(User); content:
{"timestamp":1482676142940,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported","path":"/get"}

由异常可知,尽管指定了GET方法,Feign依然会发送POST请求。

正确写法如下

(1) 方法一

?
1
2
3
4
5
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
  @RequestMapping(value = "/get", method = RequestMethod.GET)
  public User get1(@RequestParam("id") Long id, @RequestParam("username") String username);
}

这是最为直观的方式,URL有几个参数,Feign接口中的方法就有几个参数。使用@RequestParam注解指定请求的参数是什么。

(2) 方法二

?
1
2
3
4
5
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
  @RequestMapping(value = "/get", method = RequestMethod.GET)
  public User get2(@RequestParam Map<String, Object> map);
}

多参数的URL也可以使用Map去构建。当目标URL参数非常多的时候,可使用这种方式简化Feign接口的编写。

POST请求包含多个参数

下面我们来讨论如何使用Feign构造包含多个参数的POST请求。举个例子,假设我们的用户微服务的Controller是这样编写的:

?
1
2
3
4
5
6
7
@RestController
public class UserController {
  @PostMapping("/post")
  public User post(@RequestBody User user) {
    ...
  }
}

我们的Feign接口要如何编写呢?答案非常简单,示例:

?
1
2
3
4
5
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
  @RequestMapping(value = "/post", method = RequestMethod.POST)
  public User post(@RequestBody User user);
}

feign接口调用其他微服务中参数是集合对象(List<Java对象>)且请求方式是PUT或者POST方式的解决

首先,如果传输的是集合对象,一般的不是PUT或者POST请求都是可以用@RequestParam("…")的形式写在接口的新参中,比如

?
1
2
3
4
5
@GetMapping("/find/sec/consume/product/category")
public ResponseEntity<List<SecConsumeProductCategoryVO>> getSecConsumeProductCategory(@RequestParam("sellerIds") List<Long> sellerIds){
    List<SecConsumeProductCategoryVO> secConsumeProductCategories = secConsumeProductBaseBusinessService.getSecConsumeProductCategory(sellerIds);
    return ResponseEntity.ok(secConsumeProductCategories);
}

而对于feign调用且参数是集合对象的情况, 在feign客户端,则可以使用如下方式,请求路劲的注解就不能直接使用@PutMapping或者@PostMapping了,而必须使用@RequestMapping,形参仍然使用注解@RequestBody

?
1
2
@RequestMapping(value = "/cancel/daily/appointment",method = RequestMethod.PUT)
public Void updateBatchDailyAppointment(@RequestBody List<PdProductDailyAppointmentDTO> cancelAppointmentDTOS/*String cancelAppointmentStr*/);

而对于被调用方,则可以这样写

?
1
2
3
4
5
@RequestMapping(value = "/cancel/daily/appointment",method = RequestMethod.PUT)
public ResponseEntity<Void> updateBatchDailyAppointment(@RequestBody List<PdProductDailyAppointmentDTO> cancelAppointmentDTOS/*String cancelAppointmentStr*/){
    pdProductDailyAppointmentBusinessService.updateBatchDailyAppointment(cancelAppointmentDTOS);
    return ResponseEntity.status(HttpStatus.CREATED).build();
}

这样,就可以解决feign调用传输的是集合对象的问题啦

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_30616169/article/details/79668454

延伸 · 阅读

精彩推荐
  • Java教程idea中导入别人的springboot项目的方法(图文)

    idea中导入别人的springboot项目的方法(图文)

    这篇文章主要介绍了idea中导入别人的springboot项目的方法(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    小毛桃学习猿4162020-09-16
  • Java教程一篇文章带你了解Java方法的使用

    一篇文章带你了解Java方法的使用

    这篇文章主要给大家介绍了关于Java中方法使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    一朵花花10212021-11-19
  • Java教程解决Spring boot 整合Junit遇到的坑

    解决Spring boot 整合Junit遇到的坑

    这篇文章主要介绍了解决Spring boot 整合Junit遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    阿龙Growing9722021-12-16
  • Java教程java进行error捕获和处理示例(java异常捕获)

    java进行error捕获和处理示例(java异常捕获)

    通常来说,大家都是对Java中的Exception进行捕获和进行相应的处理,有些人说,error就无法捕获了。其实,error也是可以捕获的。Error和Exception都是Throwable的子...

    java教程网5542019-10-30
  • Java教程springboot+Quartz实现任务调度的示例代码

    springboot+Quartz实现任务调度的示例代码

    本篇文章主要介绍了springboot + Quartz 实现任务调度的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    殷天文9152021-03-30
  • Java教程quartz定时执行任务,并配置web.xml的操作方法

    quartz定时执行任务,并配置web.xml的操作方法

    下面小编就为大家带来一篇quartz定时执行任务,并配置web.xml的操作方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看...

    Java教程网5362020-11-27
  • Java教程Java 初识CRM之项目思路解析

    Java 初识CRM之项目思路解析

    本篇文章意在帮助大家了解CRM的一些基本概念,介绍相关业务,后文也将会将基于笔者所在公司的业务详细阐述CRM各模块,感兴趣的朋友快来看看吧...

    每日小新3352022-03-10
  • Java教程SpringBoot如何在线程中获取@Service Bean类

    SpringBoot如何在线程中获取@Service Bean类

    这篇文章主要介绍了SpringBoot如何在线程中获取@Service Bean类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    削个橘子皮8552022-07-27