MapStruct映射后实现字段大写:是否有内置替代方案?
MapStruct 实现DTO转Entity时title字段首字母大写的更优方案
我是MapStruct新手,正在学习其功能。我尝试在从DTO映射到Entity后将title字段转为每个单词首字母大写,目前采用如下方式实现,但不确定是否存在可直接使用的内置函数,无需通过@AfterMapping创建新方法:
@Mapper(componentModel = "spring") public interface RecipeRequestMapper { RecipeRequestMapper MAPPER = Mappers.getMapper(RecipeRequestMapper.class); Recipe toEntity(RecipeRequest dto); RecipeRequest toDto(Recipe entity); @AfterMapping default void getCapitalizedTitle(@MappingTarget Recipe entity, RecipeRequest dto) { entity.setTitle(WordUtils.capitalizeFully(dto.getTitle())); } }该方法似乎可行,但我想了解完成此任务是否有更合适的方式?
MapStruct本身没有内置直接处理字符串大小写转换的注解,但可以通过以下几种更简洁的方式实现,无需依赖@AfterMapping:
1. 使用@Mapping的expression属性
直接在映射注解中调用WordUtils.capitalizeFully方法,把转换逻辑和映射规则绑定在一起:
@Mapper(componentModel = "spring") public interface RecipeRequestMapper { RecipeRequestMapper MAPPER = Mappers.getMapper(RecipeRequestMapper.class); @Mapping(target = "title", expression = "java(org.apache.commons.lang3.text.WordUtils.capitalizeFully(dto.getTitle()))") Recipe toEntity(RecipeRequest dto); RecipeRequest toDto(Recipe entity); }
2. 配合@Mapper的imports属性简化表达式
如果不想在表达式中写全类名,可以通过imports属性导入WordUtils,让代码更简洁:
@Mapper(componentModel = "spring", imports = {WordUtils.class}) public interface RecipeRequestMapper { RecipeRequestMapper MAPPER = Mappers.getMapper(RecipeRequestMapper.class); @Mapping(target = "title", expression = "java(WordUtils.capitalizeFully(dto.getTitle()))") Recipe toEntity(RecipeRequest dto); RecipeRequest toDto(Recipe entity); }
3. 定义命名自定义转换方法
如果多个字段需要同类转换,或者想让逻辑更清晰,可以定义一个带@Named注解的默认方法,然后在映射时指定使用该方法:
@Mapper(componentModel = "spring") public interface RecipeRequestMapper { RecipeRequestMapper MAPPER = Mappers.getMapper(RecipeRequestMapper.class); @Mapping(target = "title", source = "title", qualifiedByName = "capitalizeFully") Recipe toEntity(RecipeRequest dto); RecipeRequest toDto(Recipe entity); @Named("capitalizeFully") default String capitalizeFully(String title) { return WordUtils.capitalizeFully(title); } }
这几种方式都比@AfterMapping更贴合MapStruct的声明式映射风格,把字段转换逻辑直接嵌入映射规则中,可读性和维护性更好。
内容的提问来源于stack exchange,提问作者user21263160
相关产品推荐
相关产品推荐

