为何UUID列在DBUnit中触发“Bad Base64 Input Character”错误?
解决DBUnit测试UUID列时的Base64解码错误问题
嘿,这个问题我之前踩过类似的坑,咱们来一步步捋清楚解决它!
首先得搞明白报错的根源:你用的DBUnit 2.6.1版本中,默认处理UUID类型的逻辑是把XML里的值当成Base64编码来解析,但你在XML里写的uuid'789446f8-3683-11e9-8f19-acde48001122'格式完全不对——这个带前缀的字符串根本不是合法的Base64,所以才会抛出“Bad Base64 input character”的错误。而改成String类型后,DBUnit直接把它当成普通字符串处理,跳过了UUID的特殊解析逻辑,自然就正常了。
下面给你几个可行的解决方案:
修正XML中的UUID格式:直接去掉
uuid'前缀,只保留标准的UUID字符串就行。比如把原来的配置改成:<object uuid="789446f8-3683-11e9-8f19-acde48001122" languageenum="1" />DBUnit的默认
UuidType处理器能直接识别这种标准格式的UUID字符串,不需要额外的前缀包裹。明确指定列类型:如果XML自动类型识别有问题,可以手动指定列的类型为
UUID,避免DBUnit误判。比如用结构化的XML写法:<object> <column name="uuid" value="789446f8-3683-11e9-8f19-acde48001122" type="UUID"/> <column name="languageenum" value="1"/> </object>自定义类型转换器(进阶方案):如果默认的UUID处理逻辑不符合你的需求,可以写一个自定义的类型转换器,强制让DBUnit按照字符串转UUID的逻辑处理。示例代码如下:
import org.dbunit.dataset.datatype.AbstractStringTypeConverter; import org.dbunit.dataset.datatype.TypeConversionException; import java.util.UUID; public class CustomUuidConverter extends AbstractStringTypeConverter { @Override protected Object convertStringToObject(String s) throws TypeConversionException { // 直接把字符串转成UUID return UUID.fromString(s); } @Override public String convertObjectToString(Object o) throws TypeConversionException { // 把UUID转成标准字符串 return ((UUID) o).toString(); } }然后在DBUnit的数据库连接配置中注册这个转换器:
import org.dbunit.database.DatabaseConfig; import org.dbunit.database.DatabaseConnection; import java.util.HashMap; // 假设你已经获取了DatabaseConnection对象 DatabaseConfig config = databaseConnection.getConfig(); config.setProperty(DatabaseConfig.PROPERTY_TYPE_CONVERTERS, new HashMap<String, ITypeConverter>() {{ put(UUID.class.getName(), new CustomUuidConverter()); }});
这样调整之后,你的实体类不用改成String,DBUnit测试也能正常运行啦!
内容的提问来源于stack exchange,提问作者Mathias
相关产品推荐
相关产品推荐

