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);
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。