Spring Data R2DBC中的覆盖数组(列表)类型转换

时间:2019-06-13 12:36:59

标签: postgresql r2dbc 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类的getArrayType方法中引发了PostgresArrayColumns,因为我的自定义类型不是简单类型。

有没有办法绕过这个守卫的某些财产?

2 个答案:

答案 0 :(得分:1)

当前,由于DatabaseClient会将集合类型的值视为Postgres数组字段的值,因此无法进行覆盖。请通过https://github.com/spring-projects/spring-data-r2dbc/提交票证以解决此问题。

答案 1 :(得分:1)

根据文档,它不是有意支持的。

<块引用>

请注意,转换器适用于单一属性。集合属性(例如集合)按元素进行迭代和转换。不支持集合转换器(例如 Converter、OutboundRow)。

来源:spring-data-r2dbc mapping reference

解决方案:
创建一个包装类(复杂类型)如下:

class CustomObjectList { 
  List<CustomObject> customObjects;
}

然后,您应用转换器 Converter<CustomObjectList, String>,反之亦然。

public class CustomObjectListToStringConverter implements Converter<CustomObjectList, String> {