一些注解的控制器方法参数表示 基于字符串的请求输入(如 @RequestParam、@RequestHeader、@PathVariable、@MatrixVariable 和 @CookieValue),如果参数被声明为字符串以外的东西,可能需要类型转换。
对于这种情况,类型转换会根据配置的转换器自动应用。默认情况下,支持简单类型(int、long、Date 和其他)。你可以通过 WebDataBinder(见 DataBinder)或通过向 FormattingConversionService 注册 Formatters 来定制类型转换。参见 Spring 字段格式化。
类型转换中的一个实际问题是 如何处理一个空的 String 源值。如果类型转换的结果是空的,这样的值会被视为缺失。对于 Long、UUID 和其他目标类型,也可能是这种情况。如果你想允许 null 被注入,要么在参数注解上使用 required 标志,要么将参数声明为 @Nullable(参数可以为 null)
。
:::info
从 5.3 开始,即使在类型转换之后,非空参数也会被强制执行。如果你的处理方法也打算接受一个空值,要么将你的参数声明为 @Nullable
,要么在相应的 @RequestParam
等注解中将其标记为 required=false
。这是一个最佳实践,也是在 5.3 升级中遇到的回归问题的推荐解决方案。
另外,你可以特别处理例如在需要 @PathVariable 的情况下产生的 MissingPathVariableException。转换后的空值将被视为空的原始值,所以相应的 Missing…Exception 变体将被抛出。 :::