문제
- r2dbc는 orm이 아니다.
- 몇몇 타입들은 custom converter가 있어야 data mapping이 된다. 참고
해결
@Bean
public R2dbcCustomConversions customConversions() {
List<Converter<?, ?>> converters = new ArrayList<>();
converters.add(new UUIDToByteArrayConverter());
converters.add(new ByteArrayToUUIDConverter());
return R2dbcCustomConversions.of(MySqlDialect.INSTANCE, converters);
}
@WritingConverter
public class UUIDToByteArrayConverter implements Converter<UUID, byte[]> {
@Override
public byte[] convert(UUID source) {
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(source.getMostSignificantBits());
bb.putLong(source.getLeastSignificantBits());
return bb.array();
}
}
@ReadingConverter
public class ByteArrayToUUIDConverter implements Converter<byte[], UUID> {
@Override
public UUID convert(byte[] source) {
return UUIDUtil.uuid(source);
}
}
이런식으로 converter를 등록하고 사용할 수 있다.
public Config extends AbstractR2dbcConfiguration {
@Override
protected List<Object> getCustomConverters() {
return List.of(new UUIDToByteArrayConverter(), new ByteArrayToUUIDConverter());
}
@Override
public ConnectionFactory connectionFactory() {
return null;
}
}
이와 같이 AbstractR2dbcConfiguration를 상속하여도 가능하나 위와 같이 ConnectionFactory도 구현해야 한다.