47.3. 参数转换器
概述 复制链接链接已复制到粘贴板!
使用参数转换器,可以将参数(字符串类型)注入 任何类型的 字段、bean 属性或资源方法参数。通过实施和绑定合适的参数转换器,您可以扩展 JAX-RS 运行时,使其能够将参数 String 值转换为目标类型。
自动转换 复制链接链接已复制到粘贴板!
参数作为 String
的实例接收,因此始终可以将它们直接注入 String
类型的字段、bean 属性和方法参数。此外,JAX-RS 运行时具有将参数字符串自动转换为以下类型的功能:
- 原语类型。
-
具有接受单个
String
参数的构造器的类型。 -
具有名为
valueOf
或fromString
的静态方法的类型,它带有一个 String 参数,该参数返回一个类型实例。 -
如果
T 是 2 或 3 中描述的类型之一,则列出
<T
>、Set<
<T>。T
> 或 SortedSet
参数转换器 复制链接链接已复制到粘贴板!
要将参数注入没有由自动转换涵盖的类型,您可以为 类型定义自定义参数转换器。参数转换器是 JAX-RS 扩展,允许您定义从 String
到自定义类型的转换,以及从自定义类型到 String
的反向方向。
工厂模式 复制链接链接已复制到粘贴板!
JAX-RS 参数转换器机制使用工厂模式。因此,您可以按需注册参数转换器提供程序(类型为 javax.ws.rs.ext.ParamConverterProvider
),而不是直接注册参数转换器(类型为 javax.ws.rs.ext.ParamConverter
Provider)。
ParamConverter 接口 复制链接链接已复制到粘贴板!
javax.ws.rs.ext.ParamConverter
接口定义如下:
要实现自己的 ParamConverter
类,您必须实施这个接口,覆盖 fromString
方法(将参数字符串转换为目标类型)和 toString
方法(将目标类型转换为字符串)。
ParamConverterProvider 接口 复制链接链接已复制到粘贴板!
javax.ws.rs.ext.ParamConverterProvider
接口定义如下:
要实现自己的 ParamConverterProvider
类,您必须实现这个接口,覆盖 getConverter
方法,这是创建 ParamConverter
实例的 factory 方法。
绑定参数转换器供应商 复制链接链接已复制到粘贴板!
要将参数转换器提供程序 绑定到 JAX-RS 运行时(使其可用于应用程序),您必须使用 @Provider
注释给您的实施类添加注解,如下所示:
此注解可确保在部署的扫描阶段自动注册参数转换器供应商。
示例 复制链接链接已复制到粘贴板!
以下示例演示了如何实现 ParamConverterProvider
和一个 ParamConverter
,它能够将参数字符串转换为 TargetType
类型:
使用参数转换器 复制链接链接已复制到粘贴板!
现在,您为 TargetType
定义了参数转换器,现在可以直接将参数注入 TargetType
字段和参数,例如:
默认值的 lazy 转换 复制链接链接已复制到粘贴板!
如果您为参数指定默认值(使用 @DefaultValue
注释),您可以选择默认值是否立即转换为目标类型(默认行为),或者是否仅在需要时转换默认值(延迟转换)。要选择 lazy 转换,请将 @ParamConverter.Lazy
注释添加到目标类型。例如: