如何配置ModelMapper同时支持驼峰与蛇形命名的序列化?
ModelMapper 同时支持驼峰、蛇形命名映射配置方案
核心思路是自定义名称分词器,让驼峰格式(如rollNo)和蛇形格式(如roll_no)拆分后得到的分词序列一致,即可自动完成字段匹配。
步骤1:实现混合命名分词器
import org.modelmapper.spi.NameTokenizer; import org.modelmapper.spi.NameableType; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MixedNameTokenizer implements NameTokenizer { // 正则同时匹配驼峰片段和下划线分隔的片段 private static final Pattern CAMEL_SNAKE_PATTERN = Pattern.compile( "[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+" ); @Override public List<String> tokenize(String name, NameableType nameableType) { List<String> tokens = new ArrayList<>(); Matcher matcher = CAMEL_SNAKE_PATTERN.matcher(name); while (matcher.find()) { // 统一转小写,避免大小写导致匹配失败 tokens.add(matcher.group().toLowerCase()); } return tokens; } }
步骤2:注册分词器到ModelMapper
import org.modelmapper.ModelMapper; import org.modelmapper.config.Configuration.AccessLevel; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ModelMapperConfig { @Bean public ModelMapper modelMapper() { ModelMapper modelMapper = new ModelMapper(); modelMapper.getConfiguration() // 开启字段匹配,支持私有字段直接映射 .setFieldMatchingEnabled(true) .setFieldAccessLevel(AccessLevel.PRIVATE) // 源和目标都使用混合分词器 .setSourceNameTokenizer(new MixedNameTokenizer()) .setDestinationNameTokenizer(new MixedNameTokenizer()) // 标准匹配策略,保证分词序列一致即可匹配 .setMatchingStrategy(org.modelmapper.MatchingStrategy.STANDARD); return modelMapper; } }
效果验证
配置完成后,不管源字段是驼峰格式rollNo还是蛇形格式roll_no,分词后都会得到["roll", "no"],和目标Student类的rollNo字段分词结果完全匹配,无需额外配置即可自动映射。
补充说明
- 如果存在特殊命名无法通过分词匹配的场景,可单独显式指定映射规则:
modelMapper.typeMap(SourceDTO.class, Student.class).addMapping(SourceDTO::getRoll_no, Student::setRollNo) - 如果是序列化输出场景需要返回不同命名格式,可配合Jackson的
@JsonNaming注解或者针对不同接口定制ObjectMapper实现。
内容的提问来源于stack exchange,提问作者Akhil Korissery
相关产品推荐
相关产品推荐

