SpringWeb URL解析常见错误

1.当 @PathVariable 遇到 /

@RestController
@Slf4j
public class HelloWorldController {
    @RequestMapping(path = "/hi1/{name}", method = RequestMethod.GET)
    public String hello1(@PathVariable("name") String name){
        return name;  
    };  
}

以上使用@PathVariable注解时,参数name中有字符串包含/,测可以修改为:
@RequestMapping(path = “/hi1/**”, method = RequestMethod.GET)

2.错误使用 @RequestParam、@PathVarible 等注解

@RequestMapping(path = "/hi1", method = RequestMethod.GET)
public String hi1(@RequestParam("name") String name){
    return name;
};

@RequestMapping(path = "/hi2", method = RequestMethod.GET)
public String hi2(@RequestParam String name){
    return name;
};


<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
   <configuration>
        <debug>false</debug>
        <parameters>false</parameters>
    </configuration>
</plugin>

我们可以看出这 2 个参数控制了一些 debug 信息是否加进 class 文件中。我们可以开启这两个参数来编译,然后使用下面的命令来查看信息:
在这里插入图片描述
为了以不变应万变,正确的修正方式是必须显式在 @RequestParam 中指定请求参数名。具体修改如下:

@RequestParam("name") String name

通过这个案例,我们可以看出:很多功能貌似可以永远工作,但是实际上,只是在特定的条件下而已。另外,这里再拓展下,IDE 都喜欢开启相关 debug 参数,所以 IDE 里运行的程序不见得对产线适应,例如针对 parameters 这个参数,IDEA 默认就开启了。

3.未考虑参数是否可选

请求如果缺少参数时:

  • 查看 namedValueInfo 的默认值,如果存在则使用它
  • 在 @RequestParam 没有指明默认值时,会查看这个参数是否必须,如果必须,则按错误处理
  • 如果不是必须,则按 null 去做具体处理,如果接受类型是 boolean,返回 false

在 Spring Web 中,默认情况下,请求参数是必选项。

4.请求参数格式错误

参数类型转换:根据源类型和目标类型寻找转化器来执行转化的
日期类型无法直接进行转换
解决:

  • 使用类似这种日期格式:Sat, 12 Aug 1995 13:30:00 GMT
  • 使用好内置格式转化器
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date date

总结

  • 当我们使用 @PathVariable 时,一定要注意传递的值是不是含有 / ;
  • 当我们使用 @RequestParam、@PathVarible 等注解时,一定要意识到一个问题,虽然下面这两种方式(以 @RequestParam 使用示例)都可以,但是后者在一些项目中并不能正常工作,因为很多产线的编译配置会去掉不是必须的调试信息

@RequestMapping(path = "/hi1", method = RequestMethod.GET)
public String hi1(@RequestParam("name") String name){
    return name;
};
//方式2:没有显式指定RequestParam的“name”,这种方式有时候会不行
@RequestMapping(path = "/hi2", method = RequestMethod.GET)
public String hi2(@RequestParam String name){
    return name;
};
  • 任何一个参数,我们都需要考虑它是可选的还是必须的。同时,你一定要想到参数类型的定义到底能不能从请求中自动转化而来。Spring 本身给我们内置了很多转化器,但是我们要以合适的方式使用上它。另外,Spring 对很多类型的转化设计都很贴心,例如使用下面的注解就能解决自定义日期格式参数转化问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值