物理一般指物理学。 物理学(physics)是研究物质最一般的运动规律和物质基本结构的学科。作为自然科学的带头学科,物理学研究大至宇宙,小至基本粒子等一切物质最基本的运动形式和规律,因此成为其他各自然科学学科的研究基础。

文件:url80.ctfile.com/f/25127180-604720087-4ab2e7?p=551685 (访问密码: 551685)


以下内容无关:

一.系统环境
Windows版本 系统类型 浏览器Chrome版本
Windows 10 专业版 64 位操作系统, 基于 x64 的处理器 版本 101.0.4951.41(正式版本) (64 位)
二.问题描述
某天启动谷歌浏览器Chrome的时候出错了,报错内容如下:应用程序无法启动,因为应用程序的并行配置不正确

image-20220419201145649

三.解决方法
打开chrome.exe的目录

C:\Users\Administrator\AppData\Local\Google\Chrome\Application
可以看到文件下面有new_chrome.exe ,点击这个可执行文件即可解决

image-20220419201338160

最后只有chrome.exe没有new_chrome.exe,现在打开谷歌浏览器Chrome就正常了

image-20220627204853767

致力于一条龙式的为您解决问题背景
近期由于项目中需要,所以需要通过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.*;

/**

  • @CreateAt: 2022/6/11 0:46

  • @ModifyAt: 2022/6/11 0:46

  • @Version 1.0
    */
    @Target(ElementType.PARAMETER)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface SlashPathVariable {

    /**

    • Alias for {@link #name}.
      */
      @AliasFor(“name”)
      String value() default “”;

    /**

    • The name of the path variable to bind to.
    • @since 4.3.3
      */
      @AliasFor(“value”)
      String name() default “”;

    /**

    • Whether the path variable is required.
    • Defaults to {@code true}, leading to an exception being thrown if the path

    • variable is missing in the incoming request. Switch this to {@code false} if
    • you prefer a {@code null} or Java 8 {@code java.util.Optional} in this case.
    • e.g. on a {@code ModelAttribute} method which serves for different requests.
    • @since 4.3.3
      */
      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;

/**

  • @CreateAt: 2022/6/11 0:36

  • @ModifyAt: 2022/6/11 0:36

  • @Version 1.0
    */
    public class SlashPathVariableParameterProcessor implements AnnotatedParameterProcessor {

    private static final Class 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;

/**

  • @CreateAt: 2022/6/11 0:48

  • @ModifyAt: 2022/6/11 0:48

  • @Version 1.0
    */
    @Component
    public class SlashBean {

    @Bean
    public Contract feignContract(){
    List processors=new ArrayList<>();
    processors.add(new SlashPathVariableParameterProcessor());
    return new SpringMvcContract(processors);
    }
    }
    最后我们将上面的参数注解PathVariable换成我们自定义的@SlashPathVariable,就大功告成了

最后
通过以上的形式进行注入的话,会注入到Spring全局,所以在使用的过程中需要考虑是否符合场景

西北大学物理习题册答案相关推荐

  1. 量子物理 詹班 计算机,6量子物理作业答案

    <6量子物理作业答案>由会员分享,可在线阅读,更多相关<6量子物理作业答案(4页珍藏版)>请在技术文库上搜索. 1.大学物理(下)大学物理(下) 作业作业 No.6 量子物理量 ...

  2. 2021考研数学二李永乐660题【习题册+答案册】

    2021考研数学二李永乐660题[习题册+答案册] 链接: https://pan.baidu.com/s/1UwoG-YcaTPErCIS3uD8Hyw 提取码: acpf 复制这段内容后打开百度网 ...

  3. 2021考研数学一李永乐660题【习题册+答案册】

    2021考研数学一李永乐660题[习题册+答案册] 链接: https://pan.baidu.com/s/1vtDFGiGtHxJIFGTKPrEbKw 提取码: 423y 复制这段内容后打开百度网 ...

  4. 重庆理工大学计算机学院学概率论,重庆理工大学概率论与数理统计习题册答案...

    重庆理工大学概率论与数理统计习题册答案 习题一一.填空题1. 2. 3. 4. ABC50260二.单项选择题1.B 2.C 3.C 4.A 5.B三.计算题1. (1)略(2)A. B.321 ...

  5. 合工大c语言考题及答案,合肥工业大学大学物理试题答案

    合肥工业大学大学物理试题答案 1. S: (answer) 2. S: (proved c) 3. S: (answer) D: 4. S: = -6 J (answer) 5. S: , (answ ...

  6. 2021考研数学三李永乐660题【习题册+答案册】

    2021考研数学三李永乐660题[习题册+答案册] 链接: https://pan.baidu.com/s/1bXre4sxMMDKtDOts0R2RdA 提取码: pis5 复制这段内容后打开百度网 ...

  7. 中考计算机试题2018视频,新东方中考专家解析2018北京中考物理试题答案(视频)...

    2018全国中考的战役即将打响,向正在拼搏的中考生致敬!新东方中考网小编会在考试结束后及时为各位网友整理2018北京中考物理试题及答案,敬请关注! [解析科目]:中考物理 各位家长.各位同学大家好,我 ...

  8. c语言设计第六章答案,c语言第六章 循环结构程序设计(习题册答案)

    第六章 循环结构程序设计 基础练习(A) 一.选择题 1.C语言中while和do-while循环的主要区别是(A). A) do-while的循环体至少无条件执行一次 B) while的循环控制条件 ...

  9. 量子物理 詹班 计算机,(电气系计算机系詹班)量子物理作业答案

    西南交大峨眉校区大学物理 西南交大峨眉校区<大学物理>(量子物理基础)作业6 (电气.计算机.詹班) 一 选择题 1. 以一定频率的单色光照射在某种金属上,测出其光电流曲线在图中用实线表示 ...

最新文章

  1. 10分钟搭建你的第一个图像识别模型 | 附完整代码
  2. ListBox combobox的常用功能
  3. codeproject网页翻译
  4. requests模块使用代理
  5. 006——php字符串中的处理函数(五)
  6. 初学__Python——Python数据类型之字符串
  7. sql网站路径php,如何在源码中找出sql语句的位置呢
  8. 玩转Github —— Octotree Chrome插件
  9. 为线程命名——prctl
  10. 【人脸识别】基于matlab GUI PCA人脸识别【含Matlab源码 748期】
  11. keil软件仿真打印输出配置
  12. 【北京邮电大学计算机考研资料汇总大全】
  13. 华为USG6320做双线-基于源地址的策略路由
  14. os.path -- 常用路径操作
  15. 秋招一个半月流水账+招银网路科技offer
  16. mysql constraint primary key_SQL PRIMARY KEY 约束
  17. calibre 电子书库/电子书管理软件--相关配置
  18. 『居善地』接口测试 — 11、接口自动化框架的设计与实现(三)
  19. 校招产品经理面经篇四
  20. android 漩涡动画,html5 canvas酷炫的粒子漩涡动画特效

热门文章

  1. 怎样在pycharm中安装torch
  2. CV2 -- 简单实现图像水平、垂直翻转
  3. 最受大厂欢迎的30款开源项目
  4. 孩子为什么不听话?因为你不会批评!
  5. 30多岁了仍一事无成,除了去工厂上班还有哪些出路?
  6. pyecharts:雷达图
  7. python 绘图时显示不同的数学符号alpha,beta,偏导、求和等等
  8. 二十、网络ifconfig 、ip 、netstat、ss之二
  9. Linux命令模糊查找
  10. P1114 “非常男女”计划(相对差,前缀和,剪枝)