Java运行时反射调用方法返回Map如何过滤Spring绑定结果保留业务键值
解决方法
问题根因
你传入getCommission方法的Map参数本身已经携带了Spring框架自动注入的org.springframework.validation.BindingResult.map键值对,而方法逻辑是直接在传入的Map对象上追加业务字段后返回,所以返回结果会保留原有所有键值对。
方案1:修改自定义类逻辑(最优)
直接在方法内部新建独立Map返回,不修改原有入参,也不会带入无关字段:
public class RCCustomer { public static Map<String, Object> getCommission(Map<String, Object> obj) { // 新建Map只存放业务字段 Map<String, Object> result = new HashMap<>(); result.put("commissionType", "vip"); result.put("commissionAmt", 50); // 如果需要保留入参里的其他业务字段,可先执行result.putAll(obj)再删除无关键 return result; } }
同时你当前的反射调用存在冗余:getCommission是静态方法,不需要实例化对象,调用可简化为:
Class<?> c = Class.forName("softbliss.framework.Routines.RCCustomer"); Method m = c.getDeclaredMethod("getCommission", Map.class); // 静态方法invoke第一个参数传null即可,无需实例化 returnObject = m.invoke(null, obj);
方案2:无法修改自定义类时,返回后过滤结果
如果不能改动RCCustomer的代码,可以在拿到返回值后手动过滤保留业务字段:
Map<String, Object> originalResult = (Map<String, Object>) returnObject; Map<String, Object> filteredResult = new HashMap<>(); // 只保留需要的业务键 filteredResult.put("commissionType", originalResult.get("commissionType")); filteredResult.put("commissionAmt", originalResult.get("commissionAmt")); // 后续使用filteredResult即可
如果业务字段不固定,也可以过滤掉所有Spring框架相关的键:
Map<String, Object> originalResult = (Map<String, Object>) returnObject; Map<String, Object> filteredResult = originalResult.entrySet().stream() .filter(entry -> !entry.getKey().startsWith("org.springframework")) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
内容的提问来源于stack exchange,提问作者Md. Imran Hasan
相关产品推荐
相关产品推荐

