ModelMapper配置异常求助:多源属性层级匹配冲突及无法解析问题
解决ModelMapper中LocalTime转java.sql.Time的ConfigurationException问题
嘿,这个问题我熟!你碰到的org.modelmapper.ConfigurationException其实是ModelMapper的自动匹配逻辑在“瞎捣乱”——明明你已经写了转换器,它还是在乱找映射路径,导致出现“匹配多个源属性层级”的报错。我来帮你一步步捋清楚并解决:
先搞懂报错根源
你提到java.sql.Time没有无参构造,所以ModelMapper没法自动实例化它,这确实需要自定义转换器,但光写转换器还不够:
ModelMapper默认的自动匹配策略会根据属性名的相似性(比如单词片段、前缀后缀)关联映射路径。你看报错里的提示:它把DTO里getFirstShift().getSecond()(LocalTime的getSecond方法)和实体里setSecondShift()关联,又把getSecondShift()本身也关联到这个目标方法,相当于找到两条映射路径,直接触发了ConfigurationException。
具体解决方案
1. 先写正确的类型转换器
先确保你的转换器能正确把java.time.LocalTime转成java.sql.Time,代码示例:
// 定义LocalTime到java.sql.Time的转换器 TypeConverter<LocalTime, java.sql.Time> localTimeToSqlTimeConverter = context -> { LocalTime source = context.getSource(); if (source == null) { return null; } // 利用java.sql.Time的valueOf方法直接转换LocalTime return java.sql.Time.valueOf(source); };
2. 给ModelMapper明确映射规则(关键!)
不能只注册转换器,必须明确告诉ModelMapper:哪些属性要用这个转换器,避免它乱自动匹配。示例代码:
ModelMapper modelMapper = new ModelMapper(); TypeMap<CarWashDTO, CarWash> typeMap = modelMapper.createTypeMap(CarWashDTO.class, CarWash.class); // 给firstShift和secondShift分别指定转换器和映射关系 typeMap.addMappings(mapper -> { mapper.using(localTimeToSqlTimeConverter) .map(CarWashDTO::getFirstShift, CarWash::setFirstShift); mapper.using(localTimeToSqlTimeConverter) .map(CarWashDTO::getSecondShift, CarWash::setSecondShift); }); // 可选:如果还是有匹配冲突,把匹配策略改成STRICT,进一步限制自动匹配的范围 modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
3. 全局注册转换器(可选)
如果你希望所有LocalTime到java.sql.Time的转换都用这个转换器,可以全局注册,然后再配合明确的属性映射:
ModelMapper modelMapper = new ModelMapper(); // 全局注册转换器 modelMapper.addConverter(localTimeToSqlTimeConverter); // 同样需要明确属性映射,避免自动匹配混乱 modelMapper.createTypeMap(CarWashDTO.class, CarWash.class) .addMappings(mapper -> { mapper.map(CarWashDTO::getFirstShift, CarWash::setFirstShift); mapper.map(CarWashDTO::getSecondShift, CarWash::setSecondShift); });
验证一下
写完配置后,测试一下你的映射逻辑:
CarWashDTO dto = new CarWashDTO(); dto.setFirstShift(LocalTime.of(8, 30)); dto.setSecondShift(LocalTime.of(14, 0)); CarWash entity = modelMapper.map(dto, CarWash.class); // 检查entity的firstShift和secondShift是否正确转换
这样应该就能解决那个ConfigurationException的问题了!
内容的提问来源于stack exchange,提问作者Bizon4ik
相关产品推荐
相关产品推荐

