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 对很多类型的转化设计都很贴心,例如使用下面的注解就能解决自定义日期格式参数转化问题。