类型转换
一些带有注解的控制器方法参数代表基于String的请求输入(例如@RequestParam、@RequestHeader、@PathVariable、@MatrixVariable和@CookieValue),如果这些参数被声明为除String以外的其他类型,则可能需要进行类型转换。
对于这种情况,类型转换会根据配置的转换器自动进行。默认情况下,支持简单类型(如 int、long、Date 等)。你可以通过 WebDataBinder(参见 DataBinder)来自定义类型转换,或者通过将 Formatters 注册到 FormattingConversionService 来进行自定义。详细内容请参阅 Spring 字段格式化。
在类型转换中,一个实际存在的问题是如何处理空字符串(empty String)的源值。如果由于类型转换导致该值变为null,那么它将被视为缺失(missing)。对于Long、UUID以及其他目标类型来说,都可能出现这种情况。如果你允许null值被注入,那么可以在参数注解上使用required标志,或者将参数声明为@Nullable。
从5.3版本开始,即使经过类型转换后,非空参数也必须被遵守(即不能被设置为null)。如果你的处理方法也打算接受null值,那么请将参数声明为@Nullable,或者在相应的@RequestParam等注解中将其标记为required=false。这是最佳实践,也是解决在升级到5.3版本后可能遇到的问题的推荐方案。
或者,你也可以专门处理某些情况,例如在@PathVariable被指定为必填参数时转换后出现的MissingPathVariableException。转换后的null值将被视为原始的空值,因此会抛出相应的Missing…Exception异常。