这里遇到的问题是:
1、一般工具类中的方法都是静态的,而在静态方法中又不能直接使用注入的mapper。如:
//注入
@Autowired
private SmsLogMapper mapper;
//方法
public static String sendSms(String mobile) {
//这里不能直接用mapper,因为mapper不是静态
}
2、第二个问题是,如果把mapper改为静态的,则在方法中使用时,mapper就是null。
解决方法
在工具类上添加@Component注解将工具类实例到spring容器中;
使用@PostConstruct注解初始化工具类和mapper,如下:
@Component
public class DynamicColumnUtils {
@Resource
private ISystemRemoteService systemRemoteService;
@Resource
private CoreTablecolumnMapper coreTablecolumnMapper;
//当前工具类
private static DynamicColumnUtils dynamicColumnUtils;
@PostConstruct
public void init() {
dynamicColumnUtils = this;
dynamicColumnUtils.coreTablecolumnMapper = this.coreTablecolumnMapper;
dynamicColumnUtils.systemRemoteService = this.systemRemoteService;
}
public static Map<String, List<CoreTablecolumn>> getDynamicMap(Object object, String tableId) {
Class<?> studentClass = object.getClass();
Field[] fields = studentClass.getDeclaredFields();
Map<String, List<CoreTablecolumn>> map = new HashMap<>();
//实体类的属性字段
List<String> nameList = Arrays.stream(fields).map(Field::getName).collect(Collectors.toList());
List<CoreTablecolumn> allCoreTablecolumns = dynamicColumnUtils.coreTablecolumnMapper.selectByTableId("1", 107L, 239L, tableId);
//远程调用用下面这行
// List<CoreTablecolumn> allCoreTablecolumns = dynamicColumnUtils.systemRemoteService.getTableColumns(tableId).getResultData();
List<CoreTablecolumn> coreTablecolumns = allCoreTablecolumns.stream().filter(item->!item.getTablecolumnNameEn().equals("id")).collect(Collectors.toList());
List<CoreTablecolumn> dynamicColumnList = coreTablecolumns.stream().filter(item -> !nameList.contains(item.getTablecolumnNameEn())).collect(Collectors.toList());
map.put("allColumns", coreTablecolumns);
map.put("dynamicColumns", dynamicColumnList);
return map;
}
}