09|Spring Web URL 解析常见错误
傅健
你好,我是傅健。
上一章节我们讲解了各式各样的错误案例,这些案例都是围绕 Spring 的核心功能展开的,例如依赖注入、AOP 等诸多方面。然而,从现实情况来看,在使用上,我们更多地是使用 Spring 来构建一个 Web 服务,所以从这节课开始,我们会重点解析在 Spring Web 开发中经常遇到的一些错误,帮助你规避这些问题。
不言而喻,这里说的 Web 服务就是指使用 HTTP 协议的服务。而对于 HTTP 请求,首先要处理的就是 URL,所以今天我们就先来介绍下,在 URL 的处理上,Spring 都有哪些经典的案例。闲话少叙,下面我们直接开始演示吧。
案例 1:当 @PathVariable 遇到 /
在解析一个 URL 时,我们经常会使用 @PathVariable 这个注解。例如我们会经常见到如下风格的代码:
看起来顺风顺水,但是假设这个 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
《Spring 编程常见错误 50 例》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(13)
- 最新
- 精选
- GkTian我运行思考题结果是:xiaoming,hanmeimei 看源码是两个同名请求参数name被放到Stiring[]中,Spring转换器转换String[]->String时,用“,”分隔符拼接后返回。 看别人运行结果不一样,很疑惑。 期待正确答案。2021-05-13210
- 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-0316
- Geek_21673e@DateTimeFormat 只会在GET请求中生效,对于请求体中的转换无能为力,这个时候需要@JsonFormat2022-07-044
- 萧虽然熟悉,但看下来收获很大2021-05-1213
- 蝴蝶我 debug 了下代码.发现这个是tomcat 处理得到的String[],然后 Spring 再处理成","分割的 String,见org.apache.catalina.connector.Request#getParameterValues方法2022-02-101
- 子夜枯灯运行程序后,结果是xiaoming,hanmeimei 两个同名请求参数name被放到Stiring[]中,Spring转换器转换String[]->String时,用“,”分隔符拼接后返回。2022-01-271
- 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-031
- 望舒结果居然跟我想象中的不一样,程序没有识别后面的参数。2021-05-1221
- 小飞同学思考题:应该是xiaoming RequestParamMapMethodArgumentResolver#resolveArgument 134行,相同参数只会取第一个参数 有个问题,@RequestBody和@RequestParam区别是不是可以加餐一下?刚学习的时候走了点弯路2021-05-121
- Geek_d5ed3d课程中的SpringBoot是哪个版本呢,用新的sprigboot,源码不一样2022-11-15归属地:陕西
收起评论