ModelMapper指定映射类型时Conditions.or方法编译报错的问题排查及替代实现方案咨询
ModelMapper指定映射类型时Conditions.or方法编译报错的问题排查及替代实现方案咨询
问题场景
你想要限制ModelMapper在从DTO映射到实体时仅处理特定类型的属性,于是配置了ModelMapper的属性条件,但编译时遇到了method or in class org.modelmapper.Conditions cannot be applied to given types的错误。
你的代码如下:
var modelMapper = new ModelMapper(); modelMapper.getConfiguration() .setMatchingStrategy(MatchingStrategies.STRICT) .setPreferNestedProperties(false) .setFullTypeMatchingRequired(true) .setPropertyCondition( Conditions.or(Conditions.isType(String.class), Conditions.or(Conditions.isType(Integer.class), Conditions.or(Conditions.isType(Long.class)))));
报错原因分析
你编译报错的核心问题是最后一次调用Conditions.or()时只传入了一个参数。ModelMapper的Conditions.or()方法要求至少传入两个PropertyCondition类型的参数,而你最后一层Conditions.or(Conditions.isType(Long.class))只传了一个条件,不符合方法的参数定义,因此编译器抛出错误。
修正后的代码实现
根据你的ModelMapper版本,有两种修正方式:
方式1:使用支持可变参数的or方法(推荐,适用于较新版本)
大部分新版本的ModelMapper已经支持or方法接收多个条件参数,直接传入所有需要限制的类型即可:
var modelMapper = new ModelMapper(); modelMapper.getConfiguration() .setMatchingStrategy(MatchingStrategies.STRICT) .setPreferNestedProperties(false) .setFullTypeMatchingRequired(true) .setPropertyCondition( Conditions.or( Conditions.isType(String.class), Conditions.isType(Integer.class), Conditions.isType(Long.class) ) );
方式2:嵌套or时确保每次都传两个参数(适用于旧版本)
如果你的ModelMapper版本不支持可变参数,需要保证每一次or调用都传入两个条件:
var modelMapper = new ModelMapper(); modelMapper.getConfiguration() .setMatchingStrategy(MatchingStrategies.STRICT) .setPreferNestedProperties(false) .setFullTypeMatchingRequired(true) .setPropertyCondition( Conditions.or( Conditions.isType(String.class), Conditions.or( Conditions.isType(Integer.class), Conditions.isType(Long.class) ) ) );
其他限制映射类型的替代方案
除了通过setPropertyCondition全局配置,你还可以用以下方式更精准地控制类型映射:
1. 自定义全局转换器
创建一个自定义转换器,只处理你指定的类型,其他类型直接返回null(表示不映射该属性):
Converter<Object, Object> typeRestrictedConverter = context -> { Object source = context.getSource(); // 仅处理String、Integer、Long类型 if (source instanceof String || source instanceof Integer || source instanceof Long) { return source; } return null; }; // 注册到ModelMapper中 modelMapper.addConverter(typeRestrictedConverter);
2. 针对特定映射对配置TypeMap
如果只需要对某一组DTO和实体的映射做类型限制,可以单独创建TypeMap并配置条件:
// 替换成你的DTO和实体类 TypeMap<YourDtoClass, YourEntityClass> typeMap = modelMapper.createTypeMap(YourDtoClass.class, YourEntityClass.class); typeMap.setPropertyCondition(Conditions.or( Conditions.isType(String.class), Conditions.isType(Integer.class), Conditions.isType(Long.class) ));
这种方式可以避免全局配置影响其他映射场景,灵活性更高。
备注:内容来源于stack exchange,提问作者Olek
相关产品推荐
相关产品推荐

