springboot如何解決非controller類引用service的問題
解決非controller類引用service問題
項(xiàng)目中遇到需要采用socket通信機(jī)制,由于這個(gè)方法沒有寫在控制類里面,調(diào)用service類的時(shí)候老是報(bào)java.lang.NullPointerException錯(cuò)誤
解決辦法
1、首先將@Autowired注解注入Service或者M(jìn)apper接口
?@Autowired ? ? PaUserService pauserService;
2、設(shè)置靜態(tài)變量
private static DomSocketUtils domSocketUtils;
3、初始化靜態(tài)變量,注意要添加 @PostConstruct注解
?@PostConstruct ?//用于在依賴關(guān)系注入完成之后需要執(zhí)行的方法上,以執(zhí)行任何初始化 ? ? public void init() { ? ? ? ? domSocketUtils = this; ? ? }
總的代碼如下
@Component() public class DomSocketUtils extends ServerSocket { @Autowired PaUserService pauserService; private static final int SERVER_PORT = 8875; // 服務(wù)端端口 private static DomSocketUtils domSocketUtils; private ServerSocket server; // @PostConstruct public DomSocketUtils() throws Exception { // server=new ServerSocket(SERVER_PORT); // load(); } @PostConstruct //用于在依賴關(guān)系注入完成之后需要執(zhí)行的方法上,以執(zhí)行任何初始化 public void init() { domSocketUtils = this; } /** * 使用線程處理每個(gè)客戶端傳輸?shù)奈募? * @throws Exception */ @Async("taskExexutor") public void load() throws Exception { server=new ServerSocket(SERVER_PORT); while (true) { System.out.println("-----------等待連接-------- "); Socket socket = server.accept();//接收連接服務(wù)端的客戶端對(duì)象 System.out.println("ip" + socket.getInetAddress() + "已連接"); new Thread(new Transfer(socket),"thread1").start();// 每接收到一個(gè)Socket就建立一個(gè)新的線程來處理它 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()); // 文件名和長(zhǎng)度 String imageurl=""; String fileName = dis.readUTF(); //獲取文件名 long fileLength = dis.readLong(); File directory = new File("E://"); //創(chuàng)建絕對(duì)路徑 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));//驗(yàn)證是否存在該病人 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層如何調(diào)用service層服務(wù)
通過init方法進(jìn)行服務(wù)注入
@Slf4j @Component public class ServerIOT { ? ? @Resource ? ? private EasybandDateService easybandDateService; ? ? @PostConstruct //通過@PostConstruct實(shí)現(xiàn)初始化bean之前進(jìn)行的操作 ? ? public void init() { ? ? ? ? serverIOT = this; ? ? ? ? serverIOT.easybandDateService = this.easybandDateService; ? ? ? ? // 初使化時(shí)將已靜態(tài)化的easybandDateService實(shí)例化 ? ? } }
調(diào)用方法形式如下
在前面添加當(dāng)前類就可以了
boolean save = serverIOT.easybandDateService.save(easybandDate);
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springBoot controller,service,dao,mapper,model層的作用說明
- springboot controller 增加指定前綴的兩種實(shí)現(xiàn)方法
- SpringBoot實(shí)現(xiàn)前后端、json數(shù)據(jù)交互以及Controller接收參數(shù)的幾種常用方式
- SpringBoot開發(fā)詳解之Controller接收參數(shù)及參數(shù)校驗(yàn)
- springboot中的controller注意事項(xiàng)說明
- springboot手動(dòng)動(dòng)態(tài)注入controller和service方式
- SpringBoot Controller中的常用注解
相關(guān)文章
SpringBoot在項(xiàng)目停止(服務(wù)停止/關(guān)閉退出)之后執(zhí)行的方法
這篇文章主要給大家介紹了SpringBoot在項(xiàng)目停止(服務(wù)停止/關(guān)閉退出)之后執(zhí)行的兩種方法,實(shí)現(xiàn)DisposableBean接口和使用@PreDestroy注解,文中有詳細(xì)的代碼講解,具有一定的參考價(jià)值,需要的朋友可以參考下2023-12-12詳解Java線程編程中的volatile關(guān)鍵字的作用
這篇文章主要介紹了Java線程編程中的volatile關(guān)鍵字的作用,針對(duì)其禁止進(jìn)行指令重排序和讀寫內(nèi)存方面著重講解,需要的朋友可以參考下2015-12-12Springboot 如何指定獲取出 yml文件里面的配置值
這篇文章主要介紹了Springboot 如何指定獲取出 yml文件里面的配置值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07MyBatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)示例
本文主要介紹了MyBatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Struts2學(xué)習(xí)手冊(cè)之文件上傳基礎(chǔ)教程
Struts2提供的文件上傳下載機(jī)制十分簡(jiǎn)便,使得我們寫很少的代碼,下面這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)手冊(cè)之文件上傳的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-05-05Java數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)單鏈表的定義與實(shí)現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)單鏈表的定義與實(shí)現(xiàn)方法,簡(jiǎn)單描述了鏈接的概念、原理,并結(jié)合實(shí)例形式分析了java定義與使用鏈表的相關(guān)步驟與操作技巧,需要的朋友可以參考下2017-10-10Java的Struts框架中<results>標(biāo)簽的使用方法
這篇文章主要介紹了Java的Struts框架中<results>標(biāo)簽的使用方法,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-11-11