最近在整合webscoket,因为在websocket中需要自定义websocket类,而在后端发送的信息的时候,需要调用service层mapper层的代码,或者自己编写一个工具类,这里在自定义类中使用
@Autowired
会报空指针异常,所以不能使用普通的注入方式,百度上能用的教程很多,我这里写一个我尝试过能用的。
解决方案:
1.上代码
@Component
public class ServerHandler extends IoHandlerAdapter {
@Autowired
protected HealthDataService healthDataService;
private static ServerHandler serverHandler ;
@PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
public void init() {
serverHandler = this;
serverHandler.healthDataService = this.healthDataService;
// 初使化时将已静态化的testService实例化
}
//测试调用
public void test(){
serverHandler.healthDataService.<你的service层方法>;
}
2.说明
- 将需要调用Spring的Service层的类通过@Component注解为组件加载;
- 同样通过@Autowired获取Service层的Bean对象;
- 为类声明一个静态变量,方便下一步存储bean对象;
- 划重点:通过注解@PostConstruct ,在初始化的时候初始化静态对象和它的静态成员变量healthDataService,原理是拿到service层bean对象,静态存储下来,防止被释放。
导入mapper层同上
/**
我自己编写的工具类
*/
@Component
public class GetChartDataUtils {
private static GetChartDataUtils getChartDataUtils ;
@Autowired
private OrderMapper orderMapper;
@PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
public void init() {
getChartDataUtils = this;
getChartDataUtils.orderMapper=this.orderMapper;
// 初使化时将已静态化的orderMapper实例化
}
public static Trend<PosMonth> getOrgMonthTrend() {
Trend<PosMonth> posMonthTrend = new Trend<>();
posMonthTrend.setTitle("客源分析趋势");
posMonthTrend.setBase(300);
posMonthTrend.setUnit("万");
List<PosMonth> posMonths = new ArrayList<PosMonth>();
//封装每个出发地点每个月的数据
PosMonth zzgs = new PosMonth("郑州工商学院",getChartDataUtils.orderMapper.queryOriginMonthCount("郑州工商学院"));//出发地为郑州工商学院每个月的数据
PosMonth zzjt = new PosMonth("河南交通学院",getChartDataUtils.orderMapper.queryOriginMonthCount("河南交通学院"));//出发地为河南交通学院每个月的数据
PosMonth zkzx = new PosMonth("周口中心站",getChartDataUtils.orderMapper.queryOriginMonthCount("周口中心站"));//出发地为周口中心站每个月的数据
PosMonth zzly = new PosMonth("郑州旅游学院",getChartDataUtils.orderMapper.queryOriginMonthCount("郑州旅游学院"));//出发地为郑州旅游学院每个月的数据
//数据封装进趋势图
posMonths.add(zzgs);
posMonths.add(zzjt);
posMonths.add(zkzx);
posMonths.add(zzly);
posMonthTrend.setData(posMonths);
return posMonthTrend;
}
public static Trend<PosMonth> getDisMonthTrend() {
Trend<PosMonth> posMonthTrend = new Trend<>();
posMonthTrend.setTitle("去向分析趋势");
posMonthTrend.setBase(300);
posMonthTrend.setUnit("万");
List<PosMonth> posMonths = new ArrayList();
//封装每个去向地点每个月的数据
PosMonth zzgs = new PosMonth("周口火车站",getChartDataUtils.orderMapper.queryDestinationMonthCount("周口火车站"));//目的地为周口火车站每个月的数据
PosMonth zzjt = new PosMonth("周口市中心站",getChartDataUtils.orderMapper.queryDestinationMonthCount("周口市中心站"));//目的地为周口市中心站每个月的数据
PosMonth zkzx = new PosMonth("周口市淮阳",getChartDataUtils.orderMapper.queryDestinationMonthCount("周口市淮阳"));//目的地为周口市淮阳每个月的数据
PosMonth zzly = new PosMonth("周口市项城",getChartDataUtils.orderMapper.queryDestinationMonthCount("周口市项城"));//目的地为周口市项城每个月的数据
//数据封装进趋势图
posMonths.add(zzgs);
posMonths.add(zzjt);
posMonths.add(zkzx);
posMonths.add(zzly);
posMonthTrend.setData(posMonths);
return posMonthTrend;
}
}