返回顶部
首页 > 资讯 > 精选 >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://lsjlt.com/news/342130.html(转载时请注明来源链接)

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

猜你喜欢
  • Feign怎么利用自定义注解实现路径转义
    本篇内容主要讲解“Feign怎么利用自定义注解实现路径转义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign怎么利用自定义注解实现路径转义”吧!背景近期由于项目中需要,所以需要通过Feig...
    99+
    2023-07-02
  • Feign利用自定义注解实现路径转义详解
    目录背景解决方案最后背景 近期由于项目中需要,所以需要通过Feign封装一个对Harbor操作的sdk信息。 在调用的过程中发现,当请求参数中带有"/"时,Fei...
    99+
    2024-04-02
  • 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
  • Linux怎么自定义安装路径
    要自定义安装路径,可以在安装软件时使用--prefix参数来指定安装路径。例如: ./configure --prefix=/pat...
    99+
    2024-03-04
    Linux
  • Flutter利用Hero组件实现自定义路径效果的动画
    目录前言Hero 的定义RectTween自定义RectTween运行效果总结前言 我们在 页面切换转场动画,英雄救场更有趣!介绍了 Hero 动画效果,使用 Hero 用...
    99+
    2024-04-02
  • SpringBoot利用自定义注解实现多数据源
    目录前置学习数据准备行动起来前置学习 需要了解 注解、Aop、SpringBoot整合Mybatis的使用。 数据准备 基础项目代码:https://gitee.com/J_look...
    99+
    2022-11-13
    SpringBoot 自定义注解 多数据源 SpringBoot多数据源
  • Java利用自定义注解实现数据校验
    目录JSR303介绍引入依赖常用注解开启校验数据校验测试自定义的封装错误信息统一异常处理分组校验创建分组校验接口添加校验注解开启分组校验自定义校验编写自定义的校验注解编写自定义的校验...
    99+
    2024-04-02
  • 怎么用自定义注解
    本篇内容介绍了“怎么用自定义注解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本知识在Java中,注解分为两种,元注解和自定义注解。很多人...
    99+
    2023-06-16
  • Django实现自定义路由转换器
    自定义路径转换器 有时候上面的内置的url转换器并不能满足我们的需求,因此django给我们提供了一个接口可以让我们自己定义自己的url转换器 django内置的路径转换器源码解...
    99+
    2024-04-02
  • js怎么实现自定义路由
    这篇文章主要为大家展示了“js怎么实现自定义路由”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js怎么实现自定义路由”这篇文章吧。本文实现自定义路由,主要是事件...
    99+
    2024-04-02
  • SpringBoot中怎么利用AOP和拦截器实现自定义注解
    本篇内容主要讲解“SpringBoot中怎么利用AOP和拦截器实现自定义注解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中怎么利用AOP和拦截器实现自定义注解”吧!Spri...
    99+
    2023-07-02
  • 怎么在Java中实现自定义注解
    怎么在Java中实现自定义注解?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注解是什么?①、引用自维基百科的内容:Java注解又称Java标注,是JDK5.0版本开始支持加入源...
    99+
    2023-06-14
  • Java怎么自定义注解
    这篇文章主要介绍“Java怎么自定义注解”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么自定义注解”文章能帮助大家解决问题。注解注解为我们在代码中添加信息提供一种形式化的方法,使我们可以在...
    99+
    2023-07-05
  • SpringBoot中利用AOP和拦截器实现自定义注解
    目录前言Spring实现自定义注解1.引入相关依赖2.相关类Java实现自定义注解通过Cglib实现通过JDk动态代理实现Cglib和JDK动态代理的区别写在最后前言 最近遇到了这样...
    99+
    2024-04-02
  • Java利用自定义注解、反射实现简单BaseDao实例
    在常见的ORM框架中,大都提供了使用注解方式来实现entity与数据库的映射,这里简单地使用自定义注解与反射来生成可执行的sql语句。这是整体的目录结构,本来是为复习注解建立的项目^.^好的,首先我们来确定思路。1. 自定义@Table @...
    99+
    2023-05-31
    java 自定义注解 反射
  • Redis+AOP怎么自定义注解实现限流
    今天小编给大家分享一下Redis+AOP怎么自定义注解实现限流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。下载1,下载页面...
    99+
    2023-07-02
  • Java注解怎么自定义使用
    这篇文章主要介绍了Java注解怎么自定义使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java注解怎么自定义使用文章都会有所收获,下面我们一起来看看吧。注解注解基本介绍注解概述:Java 注解(Annota...
    99+
    2023-07-05
  • Angular怎么利用service实现自定义服务
    这篇文章主要介绍“Angular怎么利用service实现自定义服务”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Angular怎么利用service实现自定义服务...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作