You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:39:04