广告
返回顶部
首页 > 资讯 > 精选 >Feign怎么利用自定义注解实现路径转义
  • 591
分享到

Feign怎么利用自定义注解实现路径转义

2023-07-02 13:07:48 591人浏览 独家记忆
摘要

本篇内容主要讲解“Feign怎么利用自定义注解实现路径转义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign怎么利用自定义注解实现路径转义”吧!背景近期由于项目中需要,所以需要通过Feig

本篇内容主要讲解“Feign怎么利用自定义注解实现路径转义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign怎么利用自定义注解实现路径转义”吧!

背景

近期由于项目中需要,所以需要通过Feign封装一个对Harbor操作的sdk信息。

在调用的过程中发现,当请求参数中带有"/"时,Feign默认会将"/"当成路径去解析,而不是当成完整的一个参数解析,实例如下

请求路径为:api/v2.0/projects/{projectName}/repositories

注解参数为:@PathVariable("projectName")

正常请求为:api/v2.0/projects/test/repositories

异常路径为:api/v2.0/projects/test/pro/repositories

相信细心的同学已经发现上面的差异了,正常的{projectName}中对应的值为test,而异常的却对应为test/pro,所以当异常的请求打到harbor的机器时,被解析为api/v2.0/projects/test/pro/repositories,所以会直接返回404

以上就是背景了,所以接下来我们讨论一下解决方案

解决方案

首先我们知道SpringBoot中默认是带有几种注释参数处理器的

@MatrixVariableParameterProcessor@PathVariableParameterProcessor@QueryMapParameterProcessor@RequestHeaderParameterProcessor@RequestParamParameterProcessor@RequestPartParameterProcessor

因为我们的请求参数是在路径中的,所以默认我们会使用@PathVariableParameterProcessor来标识路径参数,而我们需要转义的参数其实也是在路径中,所以我们先来看一下@PathVariableParameterProcessor是如何实现的

public boolean processArgument(AnnotatedParameterProcessor.AnnotatedParameterContext context, Annotation annotation, Method method) {        String name = ((PathVariable)ANNOTATION.cast(annotation)).value();        Util.checkState(Util.emptyToNull(name) != null, "PathVariable annotation was empty on param %s.", new Object[]{context.getParameterIndex()});        context.setParameterName(name);        MethodMetadata data = context.getMethodMetadata();        String varName = '{' + name + '}';        if (!data.template().url().contains(varName) && !this.searchMapValues(data.template().queries(), varName) && !this.searchMapValues(data.template().headers(), varName)) {            data.fORMParams().add(name);        }        return true;    }

其实在源码中,springboot并没有做什么神器的事情,就是获取使用了PathVariable注解的参数,然后再将其添加到fromParams中就可以。

看到这里我们是不是可以想到,既然在这里我们可以拿到对应的参数了,那想做什么事情不都是由我们自己来决定了,接下来说干就干,

首先我们声明一个属于自己的注解,

import org.springframework.core.annotation.AliasFor;import java.lang.annotation.*;@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface SlashPathVariable {        @AliasFor("name")    String value() default "";        @AliasFor("value")    String name() default "";        boolean required() default true;}

声明完注解后,我们就需要来自定义自己的参数解析器了,首先继承AnnotatedParameterProcessor

import feign.MethodMetadata;import feign.Util;import lombok.Data;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.openfeign.AnnotatedParameterProcessor;import org.springframework.WEB.bind.annotation.PathVariable;import java.lang.annotation.Annotation;import java.lang.reflect.AnnotatedType;import java.lang.reflect.Method;import java.net.URLEncoder;import java.NIO.charset.Charset;import java.util.Collection;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.stream.Collectors;public class SlashPathVariableParameterProcessor implements AnnotatedParameterProcessor {    private  static  final Class<SlashPathVariable> ANNOTATION=SlashPathVariable.class;    @Override    public Class<? extends Annotation> getAnnotationType() {        return (Class<? extends Annotation>) ANNOTATION;    }    @Override    public boolean processArgument(AnnotatedParameterContext context, Annotation annotation, Method method) {        MethodMetadata data = context.getMethodMetadata();        String name = ANNOTATION.cast(annotation).value();        Util.checkState(Util.emptyToNull(name) != null, "SlashPathVariable annotation was empty on param %s.", new Object[]{context.getParameterIndex()});        context.setParameterName(name);        data.indexToExpander().put(context.getParameterIndex(),this::expandMap);        return true;    }    private String expandMap(Object object) {        String encode = URLEncoder.encode(URLEncoder.encode(object.toString(), Charset.defaultCharset()), Charset.defaultCharset());        return encode;    }}

可以看到上面的代码,我们获取到自定义注解的参数后,将当前参数添加打Param后,并且为当前参数指定自定义的编码格式。

最后,我们再通过Bean的形式将对应的注解添加到容器

import feign.Contract;import org.springframework.cloud.openfeign.AnnotatedParameterProcessor;import org.springframework.cloud.openfeign.support.springMVCContract;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;import java.util.ArrayList;import java.util.List;@Componentpublic class SlashBean {    @Bean    public Contract feignContract(){        List<AnnotatedParameterProcessor> processors=new ArrayList<>();        processors.add(new SlashPathVariableParameterProcessor());        return new SpringmvcContract(processors);    }}

最后我们将上面的参数注解PathVariable换成我们自定义的@SlashPathVariable,就大功告成了

到此,相信大家对“Feign怎么利用自定义注解实现路径转义”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Feign怎么利用自定义注解实现路径转义

本文链接: https://www.lsjlt.com/news/342130.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Feign怎么利用自定义注解实现路径转义
    本篇内容主要讲解“Feign怎么利用自定义注解实现路径转义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign怎么利用自定义注解实现路径转义”吧!背景近期由于项目中需要,所以需要通过Feig...
    99+
    2023-07-02
  • Feign利用自定义注解实现路径转义详解
    目录背景解决方案最后背景 近期由于项目中需要,所以需要通过Feign封装一个对Harbor操作的sdk信息。 在调用的过程中发现,当请求参数中带有"/"时,Fei...
    99+
    2022-11-13
  • Feign怎么自定义注解翻译器
    本篇内容主要讲解“Feign怎么自定义注解翻译器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign怎么自定义注解翻译器”吧!Feign自定义注解翻译器新建自定义注解MyUrlpackage...
    99+
    2023-06-29
  • Flutter怎么利用Hero组件实现自定义路径动画效果
    这篇“Flutter怎么利用Hero组件实现自定义路径动画效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Flutter怎...
    99+
    2023-06-30
  • Java怎么实现自定义注解
    本文小编为大家详细介绍“Java怎么实现自定义注解”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么实现自定义注解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概念概念:说明程序的。给计算机看的注释:用...
    99+
    2023-07-02
  • 怎么用自定义注解
    本篇内容介绍了“怎么用自定义注解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本知识在Java中,注解分为两种,元注解和自定义注解。很多人...
    99+
    2023-06-16
  • Flutter利用Hero组件实现自定义路径效果的动画
    目录前言Hero 的定义RectTween自定义RectTween运行效果总结前言 我们在 页面切换转场动画,英雄救场更有趣!介绍了 Hero 动画效果,使用 Hero 用...
    99+
    2022-11-13
  • SpringBoot利用自定义注解实现多数据源
    目录前置学习数据准备行动起来前置学习 需要了解 注解、Aop、SpringBoot整合Mybatis的使用。 数据准备 基础项目代码:https://gitee.com/J_look...
    99+
    2022-11-13
    SpringBoot 自定义注解 多数据源 SpringBoot多数据源
  • Java利用自定义注解实现数据校验
    目录JSR303介绍引入依赖常用注解开启校验数据校验测试自定义的封装错误信息统一异常处理分组校验创建分组校验接口添加校验注解开启分组校验自定义校验编写自定义的校验注解编写自定义的校验...
    99+
    2022-11-13
  • 怎么在Java中实现自定义注解
    怎么在Java中实现自定义注解?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注解是什么?①、引用自维基百科的内容:Java注解又称Java标注,是JDK5.0版本开始支持加入源...
    99+
    2023-06-14
  • js怎么实现自定义路由
    这篇文章主要为大家展示了“js怎么实现自定义路由”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js怎么实现自定义路由”这篇文章吧。本文实现自定义路由,主要是事件...
    99+
    2022-10-19
  • SpringBoot中怎么利用AOP和拦截器实现自定义注解
    本篇内容主要讲解“SpringBoot中怎么利用AOP和拦截器实现自定义注解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中怎么利用AOP和拦截器实现自定义注解”吧!Spri...
    99+
    2023-07-02
  • Redis+AOP怎么自定义注解实现限流
    今天小编给大家分享一下Redis+AOP怎么自定义注解实现限流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。下载1,下载页面...
    99+
    2023-07-02
  • Java注解怎么自定义使用
    这篇文章主要介绍了Java注解怎么自定义使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java注解怎么自定义使用文章都会有所收获,下面我们一起来看看吧。注解注解基本介绍注解概述:Java 注解(Annota...
    99+
    2023-07-05
  • SpringBoot中利用AOP和拦截器实现自定义注解
    目录前言Spring实现自定义注解1.引入相关依赖2.相关类Java实现自定义注解通过Cglib实现通过JDk动态代理实现Cglib和JDK动态代理的区别写在最后前言 最近遇到了这样...
    99+
    2022-11-13
  • Java利用自定义注解、反射实现简单BaseDao实例
    在常见的ORM框架中,大都提供了使用注解方式来实现entity与数据库的映射,这里简单地使用自定义注解与反射来生成可执行的sql语句。这是整体的目录结构,本来是为复习注解建立的项目^.^好的,首先我们来确定思路。1. 自定义@Table @...
    99+
    2023-05-31
    java 自定义注解 反射
  • 怎么在html5中使用Canvas自定义路径动画
    怎么在html5中使用Canvas自定义路径动画?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。创建Path制作动画前,先要拿到动画的路径,对此我们可以直接使用svg的pat...
    99+
    2023-06-09
  • 使用Spring自定义注解实现任务路由的方法
    在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有一个任务调度器,可以按照不同的任务类型路由到不同的任务执行器。其本质就是通过外部参数进行一次路由和S...
    99+
    2023-05-31
    spring 路由
  • Angular怎么利用service实现自定义服务
    这篇文章主要介绍“Angular怎么利用service实现自定义服务”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Angular怎么利用service实现自定义服务...
    99+
    2022-10-19
  • 怎么利用Python实现自定义连点器
    前言前些天留意到我妈一直在预约四价疫苗都约不上,就想着写个程序来模拟人的操作去点击,判断疫苗是否被抢完,无限循环去刷新这个页面,一旦疫苗可预约就立马抢下来选择时间接种人。当预约成功后就语音循环播报:已经抢到,赶紧过来看一下。基于以上的想法和...
    99+
    2023-05-14
    Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作