覆盖 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 "[]";
    }

}

转换顺利,但 IllegalArgumentExceptionPostgresArrayColumns 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> {