Spring 编程常见错误 50 例
傅健
Cisco 高级软件工程师、Netty 源码贡献者
17065 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
结束语 (1讲)
期末测试 (1讲)
Spring 编程常见错误 50 例
15
15
1.0x
00:00/00:00
登录|注册

09|Spring Web URL 解析常见错误

你好,我是傅健。
上一章节我们讲解了各式各样的错误案例,这些案例都是围绕 Spring 的核心功能展开的,例如依赖注入、AOP 等诸多方面。然而,从现实情况来看,在使用上,我们更多地是使用 Spring 来构建一个 Web 服务,所以从这节课开始,我们会重点解析在 Spring Web 开发中经常遇到的一些错误,帮助你规避这些问题。
不言而喻,这里说的 Web 服务就是指使用 HTTP 协议的服务。而对于 HTTP 请求,首先要处理的就是 URL,所以今天我们就先来介绍下,在 URL 的处理上,Spring 都有哪些经典的案例。闲话少叙,下面我们直接开始演示吧。

案例 1:当 @PathVariable 遇到 /

在解析一个 URL 时,我们经常会使用 @PathVariable 这个注解。例如我们会经常见到如下风格的代码:
@RestController
@Slf4j
public class HelloWorldController {
@RequestMapping(path = "/hi1/{name}", method = RequestMethod.GET)
public String hello1(@PathVariable("name") String name){
return name;
};
}
当我们使用 http://localhost:8080/hi1/xiaoming 访问这个服务时,会返回"xiaoming",即 Spring 会把 name 设置为 URL 中对应的值。
看起来顺风顺水,但是假设这个 name 中含有特殊字符 / 时(例如http://localhost:8080/hi1/xiao/ming ),会如何?如果我们不假思索,或许答案是"xiao/ming"?然而稍微敏锐点的程序员都会判定这个访问是会报错的,具体错误参考:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了在 Spring Web 开发中常见的 URL 解析错误,并提供了相应的案例分析和问题修正方法。首先,通过具体案例展示了在使用 @PathVariable 注解时,当 URL 中的路径参数含有特殊字符时可能出现的问题,并提供了源码剖析和问题修正方法。其次,讨论了错误使用 @RequestParam、@PathVariable 等注解时可能出现的问题,并提供了简洁的定义方式来解决这些问题。文章还提到了在 Spring Web 中,默认情况下,请求参数是必选项,以及如何修正参数是否可选的问题。此外,还介绍了在使用 Spring URL 相关的注解时,Spring 的自动转化功能,以及如何处理请求参数格式错误的情况。通过具体案例分析和源码剖析,读者可以更好地理解 Spring Web 开发中的一些常见问题,并学习到相应的解决方法。整体而言,本文对于开发人员在实际项目中避免类似问题具有一定的指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring 编程常见错误 50 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • GkTian
    我运行思考题结果是:xiaoming,hanmeimei 看源码是两个同名请求参数name被放到Stiring[]中,Spring转换器转换String[]->String时,用“,”分隔符拼接后返回。 看别人运行结果不一样,很疑惑。 期待正确答案。
    2021-05-13
    2
    10
  • Monday
    思考题:结果是 xiaoming,hanmeimei 原因:分析源码, 目标类-String,源类型-String[]。 代码在GenericConversionService#convert,再深入最后选择的是CollectionToStringConverter#convert. 然而此方法的实现是取出数组中所有元素并用”,“进行连缀。 源码如下: public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { if (source == null) { return null; } Collection<?> sourceCollection = (Collection<?>) source; if (sourceCollection.isEmpty()) { return ""; } StringBuilder sb = new StringBuilder(); int i = 0; for (Object sourceElement : sourceCollection) { if (i > 0) { sb.append(DELIMITER); } Object targetElement = this.conversionService.convert( sourceElement, sourceType.elementTypeDescriptor(sourceElement), targetType); sb.append(targetElement); i++; } return sb.toString(); }
    2021-07-03
    1
    6
  • Geek_21673e
    @DateTimeFormat 只会在GET请求中生效,对于请求体中的转换无能为力,这个时候需要@JsonFormat
    2022-07-04
    4
  • 虽然熟悉,但看下来收获很大
    2021-05-12
    1
    3
  • 蝴蝶
    我 debug 了下代码.发现这个是tomcat 处理得到的String[],然后 Spring 再处理成","分割的 String,见org.apache.catalina.connector.Request#getParameterValues方法
    2022-02-10
    1
  • 子夜枯灯
    运行程序后,结果是xiaoming,hanmeimei 两个同名请求参数name被放到Stiring[]中,Spring转换器转换String[]->String时,用“,”分隔符拼接后返回。
    2022-01-27
    1
  • Monday
    @RequestMapping(path = "/hi6", method = RequestMethod.GET) public String hi6(@RequestParam("Date") Date date){ return "date is " + date ; }; http://localhost:8080/hi6?date=2021-5-1 20:26:53 代码是参数是”Date“,URL中是"date"大小对不上。。。
    2021-07-03
    1
  • 望舒
    结果居然跟我想象中的不一样,程序没有识别后面的参数。
    2021-05-12
    2
    1
  • 小飞同学
    思考题:应该是xiaoming RequestParamMapMethodArgumentResolver#resolveArgument 134行,相同参数只会取第一个参数 有个问题,@RequestBody和@RequestParam区别是不是可以加餐一下?刚学习的时候走了点弯路
    2021-05-12
    1
  • Geek_d5ed3d
    课程中的SpringBoot是哪个版本呢,用新的sprigboot,源码不一样
    2022-11-15归属地:陕西
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部