springboot如何解决非controller类引用service的问题

 更新时间:2022年02月24日 14:58:20   作者:xiexiangyan  
这篇文章主要介绍了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 防止重复请求防止重复点击的操作

    springboot 防止重复请求防止重复点击的操作

    这篇文章主要介绍了springboot 防止重复请求防止重复点击的操作,URL 拦截器可以使用 spring 拦截器,但使用 spring,每个需要过滤的新 URL 都需要添加配置,因此这里使用 AOP 注解 的形式来实现,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 浅谈SpringSecurity注解与AOP切面执行顺序

    浅谈SpringSecurity注解与AOP切面执行顺序

    这篇文章主要介绍了浅谈SpringSecurity注解与AOP切面执行顺序,引入Spring Security后,在Controller的方法中会出现Spring Security的方法注解与AOP同时存在的问题,这是就会设计顺序问题,需要的朋友可以参考下
    2023-10-10
  • IDEA自定义Maven仓库的实现

    IDEA自定义Maven仓库的实现

    使用Maven进行Java程序开发时,开发者能够极大地提高开发效率,本文主要介绍了IDEA自定义Maven仓库的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • java中List常用的4种stream()方法解析

    java中List常用的4种stream()方法解析

    Java中的List接口从Java 8开始新增了stream()方法,用于创建一个Stream流对象,这篇文章主要给大家介绍了关于java中List常用的4种stream()方法的相关资料,需要的朋友可以参考下
    2024-02-02
  • java中你的项目应该如何正确分层

    java中你的项目应该如何正确分层

    这篇文章主要介绍了java中你的项目应该如何正确分层,业务分层对于代码规范是比较重要,决定着以后的代码是否可复用,感兴趣的可以了解一下
    2021-04-04
  • java可变参数(不定向参数)的作用与实例

    java可变参数(不定向参数)的作用与实例

    这篇文章主要给大家介绍了关于java可变参数(不定向参数)的作用与实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • SpringBoot中整合Shiro实现权限管理的示例代码

    SpringBoot中整合Shiro实现权限管理的示例代码

    这篇文章主要介绍了SpringBoot中整合Shiro实现权限管理的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java使用Dijkstra算法实现单源最短路径

    java使用Dijkstra算法实现单源最短路径

    这篇文章主要为大家详细介绍了java使用Dijkstra算法实现单源最短路径,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Spring-boot原理及spring-boot-starter实例和代码

    Spring-boot原理及spring-boot-starter实例和代码

    spring-boot的starter是一个通过maven完成自包含并通过annotation配置使得可被spring上下文发现并实例化的一个可插拔的组件或服务。这篇文章主要介绍了Spring-boot原理及spring-boot-starter实例和代码 ,需要的朋友可以参考下
    2019-06-06
  • Nacos的单机模式启动失败问题及解决

    Nacos的单机模式启动失败问题及解决

    这篇文章主要介绍了Nacos的单机模式启动失败问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论