这篇文章主要介绍了springboot如何解决非controller类引用service的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
解决非controller类引用service问题
项目中遇到需要采用socket通信机制,由于这个方法没有写在控制类里面,调用service类的时候老是报java.lang.NullPointerException错误
解决办法
1、首先将@Autowired注解注入Service或者Mapper接口
@Autowired
PaUserService pauserService;
2、设置静态变量
private static DomSocketUtils domSocketUtils;
3、初始化静态变量,注意要添加 @PostConstruct注解
@PostConstruct //用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化
public void init() {
domSocketUtils = this;
}
总的代码如下
@Component()
public class DomSocketUtils extends ServerSocket {
@Autowired
PaUserService pauserService;
private static final int SERVER_PORT = 8875; // 服务端端口
private static DomSocketUtils domSocketUtils;
private ServerSocket server;
// @PostConstruct
public DomSocketUtils() throws Exception {
// server=new ServerSocket(SERVER_PORT);
// load();
}
@PostConstruct //用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化
public void init() {
domSocketUtils = this;
}
/**
* 使用线程处理每个客户端传输的文件
* @throws Exception
*/
@Async("taskExexutor")
public void load() throws Exception {
server=new ServerSocket(SERVER_PORT);
while (true) {
System.out.println("-----------等待连接-------- ");
Socket socket = server.accept();//接收连接服务端的客户端对象
System.out.println("ip" + socket.getInetAddress() + "已连接");
new Thread(new Transfer(socket),"thread1").start();// 每接收到一个Socket就建立一个新的线程来处理它
System.out.println(Thread.currentThread().getName());
}
}
/**
* 处理客户端传输过来的文件线程类
*/
class Transfer implements Runnable {
private Socket socket;
private DataInputStream dis;
private FileOutputStream fos;
public Transfer(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
dis = new DataInputStream(socket.getInputStream());
// 文件名和长度
String imageurl="";
String fileName = dis.readUTF(); //获取文件名
long fileLength = dis.readLong();
File directory = new File("E://"); //创建绝对路径
if(!directory.exists()) {
directory.mkdir();
}
File file = new File("E://");
fos = new FileOutputStream(basepath);//存入文件
// 开始接收文件
byte[] bytes = new byte[1024];
int length = 0;
while((length = dis.read(bytes, 0, bytes.length)) != -1) {
fos.write(bytes, 0, length);
fos.flush();
}
File file1 = new File(basepath);//读取文件
DicomInputStream dis = new DicomInputStream(file1);
Attributes fmi = dis.readFileMetaInformation();
Attributes attrs = dis.readDataset(-1, -1);
PaUser role = domSocketUtils.pauserService.getpaUserRole1(attrs.getString(Tag.PatientID));//验证是否存在该病人
System.out.println("======== 文件接收成功 [File Name:" + fileName + "] ");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(fos != null)
fos.close();
if(dis != null)
dis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
注:socket文件接收的是dicom文件
在非controller层如何调用service层服务
通过init方法进行服务注入
@Slf4j
@Component
public class ServerIOT {
@Resource
private EasybandDateService easybandDateService;
@PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
public void init() {
serverIOT = this;
serverIOT.easybandDateService = this.easybandDateService;
// 初使化时将已静态化的easybandDateService实例化
}
}
调用方法形式如下
在前面添加当前类就可以了
boolean save = serverIOT.easybandDateService.save(easybandDate);
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:springboot如何解决非controller类引用service的问题
基础教程推荐
猜你喜欢
- java实现多人聊天系统 2023-05-19
- Java实现线程插队的示例代码 2022-09-03
- Java并发编程进阶之线程控制篇 2023-03-07
- Java数据结构之对象比较详解 2023-03-07
- Java实现查找文件和替换文件内容 2023-04-06
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java文件管理操作的知识点整理 2023-05-19
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- java基础知识之FileInputStream流的使用 2023-08-11
- springboot自定义starter方法及注解实例 2023-03-31