如何在DB Rider的YAML配置中正确表示字节数组
在YAML数据集(Database Rider + H2)中正确表示字节数组的方法
问题原因
你当前YAML里的\x4c6f72656d20697073756d写法无法被正确解析,是因为YAML的\x转义仅针对单个ASCII字符(比如\x4c会被解析为字符L),整段十六进制字符串会被当作普通文本存入数据库,rs.getBytes读取的是这段文本的字节,自然和你预期的二进制数据不符。
可行解决方案
1. 使用Base64编码(最通用)
将目标字节数组转换为Base64字符串,直接写入YAML即可。Database Rider会自动识别Base64字符串并转换为二进制数据存入对应字段。
比如"Lorem ipsum"的Base64编码是TG9yZW0gaXBzdW0=,修改YAML如下:
categories: - id: 1 name: "Beverages" description: "Soft drinks, coffees, teas, beers, and ales" picture: TG9yZW0gaXBzdW0= # Base64编码的"Lorem ipsum"
测试代码中的断言无需修改,rs.getBytes会正确读取到预期的字节数组。
2. 使用H2的二进制字面量语法
H2支持用X'十六进制内容'表示二进制数据,直接在YAML中使用该语法,Database Rider会将其作为SQL原生值插入数据库:
categories: - id: 1 name: "Beverages" description: "Soft drinks, coffees, teas, beers, and ales" picture: X'4C6F72656D20697073756D'
这种写法直接贴合H2的二进制类型语法,无需额外编码转换。
3. 自定义类型转换器(兼容原有十六进制写法)
如果需要保留YAML中的十六进制格式,可以给Database Rider添加自定义类型转换器,将十六进制字符串转为byte[]:
首先实现转换器:
import javax.persistence.AttributeConverter; import java.util.Locale; public class HexStringToByteArrayConverter implements AttributeConverter<String, byte[]> { @Override public byte[] convertToDatabaseColumn(String hexStr) { if (hexStr == null || hexStr.isBlank()) { return null; } // 去除可能的\x前缀 String cleanHex = hexStr.startsWith("\\x") ? hexStr.substring(2) : hexStr; cleanHex = cleanHex.replaceAll("\\s+", "").toUpperCase(Locale.ROOT); int length = cleanHex.length(); byte[] result = new byte[length / 2]; for (int i = 0; i < length; i += 2) { result[i / 2] = (byte) ((Character.digit(cleanHex.charAt(i), 16) << 4) + Character.digit(cleanHex.charAt(i + 1), 16)); } return result; } @Override public String convertToEntityAttribute(byte[] bytes) { if (bytes == null) { return null; } StringBuilder sb = new StringBuilder("\\x"); for (byte b : bytes) { sb.append(String.format("%02X", b)); } return sb.toString(); } }
然后在测试类上配置该转换器:
@DBRider @ExtendWith(SpringExtension.class) @DataSet( value = "categories.yml", transformers = @DataSetTransformer( transformer = TypeTransformer.class, converters = HexStringToByteArrayConverter.class ) ) class CategoryJdbcTest { // 测试代码不变 }
之后你原来YAML中的\x4c6f72656d20697073756d写法就能被正确解析为目标字节数组。
内容的提问来源于stack exchange,提问作者user4695271
相关产品推荐
相关产品推荐

