如何用Model Mapper实现Entity转DTO(String转UUID)及解决id为空问题
解决ModelMapper将Client映射到ClientDTO时id字段为null的问题
我明白你碰到的麻烦了——你的Client实体里id是String类型,而ClientDTO里id是UUID类型,ModelMapper默认没办法自动完成这种类型转换,所以映射后DTO的id才会变成null。下面给你几个靠谱的解决办法:
方法一:自定义String到UUID的转换器
先写一个转换器实现Converter<String, UUID>,然后把它注册到ModelMapper中,这样ModelMapper就知道怎么把字符串转换成UUID了:
// 自定义转换器 Converter<String, UUID> stringToUuidConverter = context -> { String source = context.getSource(); return source != null ? UUID.fromString(source) : null; }; // 配置ModelMapper ModelMapper modelMapper = new ModelMapper(); modelMapper.addConverter(stringToUuidConverter); // 执行映射 Client client = new Client(); client.setId("550e8400-e29b-41d4-a716-446655440000"); client.setName("Test Client"); client.setContactEmail("test@example.com"); ClientDTO clientDTO = modelMapper.map(client, ClientDTO.class); // 现在clientDTO的id应该能正确映射了
方法二:使用PropertyMap显式指定字段映射
如果需要更精细的控制,可以用PropertyMap来明确指定id字段的转换逻辑:
PropertyMap<Client, ClientDTO> clientMap = new PropertyMap<>() { @Override protected void configure() { map().setId(UUID.fromString(source.getId())); // 其他字段ModelMapper会自动映射,不用重复写 } }; ModelMapper modelMapper = new ModelMapper(); modelMapper.addMappings(clientMap); // 映射测试同上 Client client = new Client(); client.setId("550e8400-e29b-41d4-a716-446655440000"); ClientDTO clientDTO = modelMapper.map(client, ClientDTO.class);
注意事项
- 确保你的
Client实体中的id是标准UUID格式的字符串,否则UUID.fromString()会抛出IllegalArgumentException,可以在转换器里加个异常处理逻辑来避免崩溃。 - 如果你的项目里有很多类似的String转UUID的映射需求,建议把转换器配置成全局的,避免重复代码。
内容的提问来源于stack exchange,提问作者Anunay
相关产品推荐
相关产品推荐

