在Controll之外,如果使用@Autowired注入服务,会显示空指针,这是因为SpringBoot自己本身的执行顺序的问题,你的类的创建可能"错过"了珍贵的注入时间。
- 为了解决这个问题,我们需要在正确的时间保存下来我们注入的Service,并且建立引用,防止被Java回收对象,需要使用静态的对象保存它。
- 而为了抓住时机,需要实现ServletContextAware接口,这个为什么可以自己查一下哈(我没搜到)。
看看实现:
package com.example.demo.Netty.UDP;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.Parser.Dao.ParseControlService;
import com.example.demo.Parser.Imp.ControlCondition.ParseControlServiceImp;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.context.ServletContextAware;
import javax.servlet.ServletContext;
/**
* 对于新消息进行操作的类
*/
@Log4j2
@Component
public class NettyUDPServerHandler extends SimpleChannelInboundHandler<DatagramPacket> implements ServletContextAware {
// 要注入的服务
private ParseControlService parseControlService;
private static ParseControlService parseControl;
@Autowired
public void setParseControlService(ParseControlService parseControlService) {
this.parseControlService = parseControlService;
}
/**
* 重写接收到的数据的具体操作
* @param channelHandlerContext
* @param datagramPacket
* @throws Exception
*/
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket) throws Exception {
// 调用保存的对象
parseControl.parseControl(datagramPacket.content());
}
/**
* 出错回调
* @param channelHandlerContext
* @param cause
* @throws Exception
*/
@Override
public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable cause) throws Exception {
cause.printStackTrace();
channelHandlerContext.close();
}
//在这里抓住时机保存
@Override
public void setServletContext(ServletContext servletContext) {
parseControl = this.parseControlService;
}
}
亲测可以.