覆盖 Spring 数据 R2DBC 中的数组(列表)类型转换
Overriding array(list) type conversions in Spring Data R2DBC
我使用 Postgres 作为我的数据源,我已经为 属性 创建了一个自定义 Spring 转换器,其中包含我的自定义对象列表:
@Slf4j
@WritingConverter
@AllArgsConstructor
public class CustomObjectListToStringConverter implements Converter<List<CustomObject>, String> {
@Override
public String convert(@Nonnull List<CustomObject> source) {
try {
return objectMapper.writeValueAsString(source);
} catch (JsonProcessingException e) {
log.error("Error occurred while serializing list of CustomObject to JSON.", e);
}
return "[]";
}
}
转换顺利,但 IllegalArgumentException
在 PostgresArrayColumns
class 的 getArrayType
方法中引发,因为我的自定义类型不是简单类型。
对于某些属性有没有办法绕过这个守卫?
目前,无法覆盖,因为 DatabaseClient
将 collection-typed 值视为 Postgres 数组字段的值。请在 https://github.com/spring-projects/spring-data-r2dbc/ 提交工单以解决问题。
根据文档有意不支持它。
Please note that converters get applied on singular properties. Collection properties (e.g. Collection) are iterated and converted element-wise. Collection converters (e.g. Converter<List>, OutboundRow) are not supported.
来源:spring-data-r2dbc mapping reference
解法:
创建一个包装器class(复杂类型)如下:
class CustomObjectList {
List<CustomObject> customObjects;
}
然后,您应用转换器 Converter<CustomObjectList, String>
,反之亦然。
public class CustomObjectListToStringConverter implements Converter<CustomObjectList, String> {
我使用 Postgres 作为我的数据源,我已经为 属性 创建了一个自定义 Spring 转换器,其中包含我的自定义对象列表:
@Slf4j
@WritingConverter
@AllArgsConstructor
public class CustomObjectListToStringConverter implements Converter<List<CustomObject>, String> {
@Override
public String convert(@Nonnull List<CustomObject> source) {
try {
return objectMapper.writeValueAsString(source);
} catch (JsonProcessingException e) {
log.error("Error occurred while serializing list of CustomObject to JSON.", e);
}
return "[]";
}
}
转换顺利,但 IllegalArgumentException
在 PostgresArrayColumns
class 的 getArrayType
方法中引发,因为我的自定义类型不是简单类型。
对于某些属性有没有办法绕过这个守卫?
目前,无法覆盖,因为 DatabaseClient
将 collection-typed 值视为 Postgres 数组字段的值。请在 https://github.com/spring-projects/spring-data-r2dbc/ 提交工单以解决问题。
根据文档有意不支持它。
Please note that converters get applied on singular properties. Collection properties (e.g. Collection) are iterated and converted element-wise. Collection converters (e.g. Converter<List>, OutboundRow) are not supported.
来源:spring-data-r2dbc mapping reference
解法:
创建一个包装器class(复杂类型)如下:
class CustomObjectList {
List<CustomObject> customObjects;
}
然后,您应用转换器 Converter<CustomObjectList, String>
,反之亦然。
public class CustomObjectListToStringConverter implements Converter<CustomObjectList, String> {