最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Feign遠(yuǎn)程調(diào)用傳遞對(duì)象參數(shù)并返回自定義分頁(yè)數(shù)據(jù)的過(guò)程解析

 更新時(shí)間:2022年03月17日 15:22:40   作者:RyanJJ_  
這篇文章主要介紹了Feign遠(yuǎn)程調(diào)用傳遞對(duì)象參數(shù)并返回自定義分頁(yè)數(shù)據(jù)的過(guò)程解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Feign介紹

Feign是Netflix公司開(kāi)源的輕量級(jí)rest客戶端,使用Feign可以非常方便的實(shí)現(xiàn)Http 客戶端。Spring Cloud引入Feign并且集成了Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡調(diào)用。

Feign測(cè)試

1.在yml文件里面增加了配置信息

feign:
? httpclient:
? ? enabled: true

2.在客戶端pom.xml文件中引入的依賴(消費(fèi)者端)

<!-- 配置feign 發(fā)送請(qǐng)求使用 httpclient,而不是java原生 -->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.apache.httpcomponents</groupId>
? ? ? ? ? ? <artifactId>httpclient</artifactId>
? ? ? ? </dependency>
? ? ? ?
?<!-- 此處不使用Apache HttpClient 的httpclient依賴,一定要使用下面這個(gè)依賴,因?yàn)槲覀円祷氐氖荘OJO類-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>io.github.openfeign</groupId>
? ? ? ? ? ? <artifactId>feign-httpclient</artifactId>
? ? ? ? ? ? <version>10.1.0</version>
? ? ? ? </dependency>

此處注意

此處依賴為什么使用io.github.openfeign的httpclient,而不使用Apache 的HttpClient替換Feign原生httpclient。

看了很多文章,都是說(shuō)引用這個(gè)依賴:

<!-- 使用Apache HttpClient替換Feign原生httpclient-->
<!-- ? ? ? ?<dependency>-->
<!-- ? ? ? ? ? ?<groupId>com.netflix.feign</groupId>-->
<!-- ? ? ? ? ? ?<artifactId>feign-httpclient</artifactId>-->
<!-- ? ? ? ? ? ?<version>8.16.1</version>-->
<!-- ? ? ? ?</dependency>-->

但是不知道哪里的問(wèn)題,在獲取返回結(jié)果時(shí)一直報(bào)錯(cuò):

Caused by: java.lang.NoSuchMethodError: feign.Response.create(ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)Lfeign/Response;

查看源碼得知,openfeign在接受返回值時(shí)調(diào)用的不是httpclient的feign-core包的代碼而是調(diào)用的本身的feign-core的代碼,而本身的feign-core包中的Response類沒(méi)有create方法。兩個(gè)feign-core包中的Retryer接口不一致導(dǎo)致的,openfeign的feign-core版本為10.1.0 httpclient的版本為8.16.1。

找了半天問(wèn)題,最后就把httpclient的依賴換成代碼塊中的依賴就OK了。

3.服務(wù)調(diào)用端接口為

此處使用POST請(qǐng)求,第6步有解釋。

@Slf4j
@RequestMapping("/list")
@RestController
public class WebQueryListController { ??
? ??
? ? @Autowired
? ? private TourismListService listService;
? ?
? ? @PostMapping("/ad/allByQuery")
? ? public ApiResult<Page<TourismAd>> allByQuery(@RequestBody TourismAdQuery adQuery){
? ? ? ? ApiResult<Page<TourismAd>> ?pageApiResult = ?listService.selectAllAdByQuery(adQuery);
? ? ? ? return pageApiResult;
? ? }

我的TourismAdQuery類繼承了Page類(似乎沒(méi)有影響)

@Data
public class TourismAdQuery extends ?Page<TourismAd> {
?
? ? /**
? ? ?* 標(biāo)題
? ? ?*/
? ? private String title;
? ? ?。。。。。。。
}

4.服務(wù)調(diào)用端Service代碼

此處@PostMapping地址為服務(wù)端提供的api接口地址

@FeignClient(name = "fisher-back-service", fallback = TourismListFallback.class, configuration = FeignConfig.class)
public interface TourismListService {
?
? ? /**
? ? ?* 分頁(yè)查詢廣告根據(jù)查詢條件
? ? ?* @param adQuery
? ? ?* @return
? ? ?*/
? ?@PostMapping(value = "/ad/get/allByQuery")
? ? ApiResult<Page<TourismAd>> selectAllAdByQuery(TourismAdQuery adQuery);

5.服務(wù)調(diào)用端Fallback為

@Slf4j
@Service
public class TourismListFallback implements TourismListService {
?
? ? /**
? ? ?* 分頁(yè)查詢廣告根據(jù)查詢條件
? ? ?*
? ? ?* @param adQuery
? ? ?* @return
? ? ?*/
? ? @Override
? ? public ApiResult<Page<TourismAd>> selectAllAdByQuery(TourismAdQuery adQuery) {
? ? ? ? log.error("調(diào)用 selectAllAdByQuery 方法異常,參數(shù):{}", adQuery);
? ? ? ? return null;
? ? }

6.服務(wù)提供端代碼為

此處傳進(jìn)來(lái)的參數(shù)是一個(gè)POJO類,如果不使用@RequestBody注解 的話,feign遠(yuǎn)程調(diào)用時(shí)參數(shù)是無(wú)法被接收到的。

雖然獲取數(shù)據(jù)時(shí),大多數(shù)使用 Get請(qǐng)求方法,但是GET方法無(wú)法接收@RequestBody參數(shù)體。

所以只好改GET請(qǐng)求為POST請(qǐng)求。

@RestController
@RequestMapping("/ad")
public class TourismAdController extends BaseController<TourismAdService, TourismAd, Integer> {
?
? ? @Autowired
? ? private TourismAdService adService;
?
? ?@ApiOperation(value = "分頁(yè)查詢廣告根據(jù)查詢條件", notes = "分頁(yè)查詢廣告根據(jù)查詢條件", httpMethod = "POST")
? ? @PostMapping("/get/allByQuery")
? ? public ApiResult<Page<TourismAd>> allByQuery(@RequestBody TourismAdQuery adQuery){
? ? ? ? return adService.selectAllByQuery(adQuery);
? ? }

7.測(cè)試

調(diào)用接口http://localhost:9009/list/ad/allByQuery 傳遞json格式參數(shù)即可:

{
? "address": "",
? "title": "廣告位1",
? "size": 6
}

成功分頁(yè)獲取數(shù)據(jù) 自定義的返回類型數(shù)據(jù):

{
? "data": {
? ? "records": [
? ? ? {
? ? ? ? "id": 1,
? ? ? ? "title": "廣告位1",
? ? ? ? "description": "招商",
? ? ? ? "sort": 0,
? ? ? ? "datetime": "2019-09-26 17:46:50",
? ? ? ? "updatetime": "2019-09-26 17:46:50",
? ? ? ? "peopleid": 0,
? ? ? ? "display": 0,
? ? ? ? "content": "04004",
? ? ? ? "file": "444//44.jpg",
? ? ? ? "leaseperson": "找找",
? ? ? ? "address": "杭州市",
? ? ? ? "idcard": "1154465656656",
? ? ? ? "phone": "131654799"
? ? ? }
? ? ],
? ? "total": 1,
? ? "size": 6,
? ? "current": 1,
? ? "searchCount": true,
? ? "pages": 1
? },
? "code": 200,
? "message": "分頁(yè)獲取成功"
}

Feign調(diào)用分頁(yè)接口報(bào)錯(cuò):Method has too many Body parameters

接口定義:

@ApiOperation(value = "分頁(yè)查詢會(huì)話")
@PostMapping(Routes.SESSIONS_QUERY)
JsonResult<Pagination<SessionInfo>> querySessions(@RequestBody @Valid SessionsQo qo,
@PageableDefault(size = 20, sort = "id", direction = Sort.Direction.DESC) Pageable pageable);

服務(wù)消費(fèi)方調(diào)用報(bào)錯(cuò):

Method has too many Body parameters: public abstract com.xingren.common.data.JsonResult com.xingren.xxx.yyy.contract.api.controller.ISessionController.querySessions(com.xingren.xxx.yyy.contract.qo.SessionsQo,org.springframework.data.domain.Pageable)

解決方法

通過(guò)搜索、調(diào)研,目前有三種解決方法:

1、將分頁(yè)屬性直接通過(guò)入?yún)鬟f,接口定義如下:

@ApiOperation(value = "分頁(yè)查詢會(huì)話")
@PostMapping(Routes.SESSIONS_QUERY)
JsonResult<Pagination<SessionInfo>> querySessions(@RequestBody @Valid SessionsQo qo,
@RequestParam("page") Integer page, @RequestParam("size") Integer size, @RequestParam("sort") Sort sort);

2、將分頁(yè)對(duì)象冗余在Qo中(通過(guò)繼承實(shí)現(xiàn)):

@Data
@NoArgsConstructor
@ApiModel(value = "查詢會(huì)話")
public class SessionsQo extends PageableParam {
@ApiParam(value = "會(huì)話id列表")
private List<Long> sessionIdIn = Lists.newArrayList();
...
}

3、通過(guò)注解傳遞(參考:Issue):

服務(wù)提供方定義注解:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface PageableParam {
}

服務(wù)提供方定義接口:

@ApiOperation(value = "分頁(yè)查詢會(huì)話")
@PostMapping(Routes.SESSIONS_QUERY)
JsonResult<Pagination<SessionInfo>> querySessions(@RequestBody @Valid SessionsQo qo,
@PageableParam @SpringQueryMap Pageable pageable);

服務(wù)消費(fèi)方定義processor:

@Bean
public PageableParamProcessor pageableParamProcessor() {
    return new PageableParamProcessor();
}
 
public static class PageableParamProcessor implements AnnotatedParameterProcessor { 
    private static final Class<PageableParam> ANNOTATION = PageableParam.class;
 
    @Override
    public Class<? extends Annotation> getAnnotationType() {
        return ANNOTATION;
    }
 
    @Override
    public boolean processArgument(AnnotatedParameterContext context, Annotation annotation, Method method) {
        int parameterIndex = context.getParameterIndex();
        MethodMetadata data = context.getMethodMetadata();
        data.queryMapIndex(parameterIndex);
        return true;
    } 
}

服務(wù)消費(fèi)方自定義PageableUtil:

public class PageableUtil extends PageRequest implements Map<String, Object> {?
? ? public static final String PAGE = "page";
? ? public static final String SIZE = "size";
? ? public static final String SORT = "sort";
?
? ? @Delegate
? ? protected Map<String, Object> delegate = Maps.newHashMap();?
? ? public PageableUtil(int page, int size, Sort sort) {
? ? ? ? super(page, size, sort);
? ? ? ? delegate.put(PAGE, page);
? ? ? ? delegate.put(SIZE, size);
? ? ? ? if (Objects.nonNull(sort)) {
? ? ? ? ? ? delegate.put(SORT, sort.toString().replace(": ", ","));
? ? ? ? }
? ? }
?
? ? public PageableUtil(int page, int size) {
? ? ? ? super(page, size);
? ? ? ? delegate.put(PAGE, page);
? ? ? ? delegate.put(SIZE, size);
? ? }?
}

定義PageableUtil原因:主要是因?yàn)镕eign對(duì)QueryMap類型參數(shù)的序列化和反序列化的言七墨方式與Sort.Order的不兼容,導(dǎo)致排序失效。

服務(wù)消費(fèi)方調(diào)用方式:

SessionsQo qo = SessionsQo.builder().sessionIdIn(Collections.singletonList(20L)).build();
JsonResult<Pagination<SessionInfo>> pageInfo = sessionContract.querySessions(qo, new PageableUtil(0, 5, new Sort(Sort.Direction.DESC,

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • RocketMQ設(shè)計(jì)之主從復(fù)制和讀寫(xiě)分離

    RocketMQ設(shè)計(jì)之主從復(fù)制和讀寫(xiě)分離

    這篇文章主要介紹了RocketMQ設(shè)計(jì)之主從復(fù)制和讀寫(xiě)分離,RocketMQ提高消費(fèi)避免Broker發(fā)生單點(diǎn)故障引起B(yǎng)roker上的消息無(wú)法及時(shí)消費(fèi),下文關(guān)于了RocketMQ的相關(guān)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • SpringBoot通過(guò)自定義注解與異步來(lái)管理日志流程

    SpringBoot通過(guò)自定義注解與異步來(lái)管理日志流程

    實(shí)現(xiàn)日志管理說(shuō)實(shí)話方式還挺多,個(gè)人使用過(guò)直接在Controller代碼里面寫(xiě)、AOP+自定義注解、ConstraintValidator。本文主要和大家講的是自定義注解與異步來(lái)管理日志流程,感興趣的可以了解一下
    2023-03-03
  • SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例

    SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例

    由于短鏈接可能涉及到用戶隱私和安全問(wèn)題,所以短鏈接系統(tǒng)也需要符合相關(guān)的數(shù)據(jù)保護(hù)和安全標(biāo)準(zhǔn),本文主要介紹了SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例,感興趣的可以了解一下
    2023-09-09
  • Java FTPClient連接池的實(shí)現(xiàn)

    Java FTPClient連接池的實(shí)現(xiàn)

    這篇文章主要介紹了Java FTPClient連接池的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Spring?Boot如何實(shí)現(xiàn)統(tǒng)一數(shù)據(jù)返回

    Spring?Boot如何實(shí)現(xiàn)統(tǒng)一數(shù)據(jù)返回

    這篇文章主要介紹了Spring?Boot如何實(shí)現(xiàn)統(tǒng)一數(shù)據(jù)返回,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 深入淺出MyBatis中映射文件和實(shí)體類的關(guān)聯(lián)性

    深入淺出MyBatis中映射文件和實(shí)體類的關(guān)聯(lián)性

    這篇文章主要介紹了MyBatis中映射文件和實(shí)體類的關(guān)聯(lián)性的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • 使用JSON.toJSONString格式化成json字符串時(shí)保留null屬性

    使用JSON.toJSONString格式化成json字符串時(shí)保留null屬性

    這篇文章主要介紹了使用JSON.toJSONString格式化成json字符串時(shí)保留null屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Protobuf的簡(jiǎn)要介紹及使用詳解

    Protobuf的簡(jiǎn)要介紹及使用詳解

    這篇文章主要介紹了Protobuf的簡(jiǎn)要介紹及使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java虛擬機(jī)之JVM調(diào)優(yōu)詳解

    java虛擬機(jī)之JVM調(diào)優(yōu)詳解

    這篇文章主要介紹了java虛擬機(jī)之JVM調(diào)優(yōu)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java虛擬機(jī)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot實(shí)現(xiàn)elasticsearch索引操作的代碼示例

    SpringBoot實(shí)現(xiàn)elasticsearch索引操作的代碼示例

    這篇文章主要給大家介紹了SpringBoot如何實(shí)現(xiàn)elasticsearch 索引操作,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考閱讀下
    2023-07-07

最新評(píng)論

伊通| 台南县| 巴楚县| 布尔津县| 富蕴县| 信阳市| 中西区| 介休市| 杭州市| 新兴县| 商洛市| 巴里| 大兴区| 绵竹市| 怀集县| 商水县| 望江县| 通州区| 旬邑县| 双峰县| 阳春市| 灵璧县| 巴林右旗| 环江| 新竹市| 尼玛县| 屯昌县| 衡东县| SHOW| 孟村| 黄石市| 错那县| 东辽县| 重庆市| 南开区| 潼南县| 右玉县| 新乡县| 萝北县| 孟津县| 同心县|