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

目录
  • 解决非controller类引用service问题
    • 解决办法
    • 总的代码如下
  • 在非controller层如何调用service层服务
    • 通过init方法进行服务注入
    • 调用方法形式如下

解决非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);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot如何在线程中获取@Service Bean类

    目录 如何在线程中获取@ServiceBean类 我们现在开始解决问题 多线程中获取bean对象 创建类 多线程中的调用方式 如何在线程中获取@Service Bean类 这个适用于没有Spring配置文件的Springboot项目中,有配置文件的话取bean就方便多了. 下图是我用@Service注解声明的一个Mybatis Mapper Bean,平常在Springboot扫描配置下的类直接用 @Autowired注解依赖注入. 我现在需要在线程中使用,然而Springboot自然而然只能扫

  • springBoot controller,service,dao,mapper,model层的作用说明

    目录 零.业务逻辑 一.Dao(Data Access Object):数据存储对象 二.Service:服务 三.Controller:控制器 四.model:模型 五.View层 六.它们之间的关系 DAO层.Service层和Controller层的区别 1.dao层:数据访问层 2.service层:服务层 3.controller层 关系 零.业务逻辑 Controller-->service接口-->serviceImpl-->dao接口-->daoImpl-->

  • springboot中如何通过main方法调用service或dao

    目录 如何通过main方法调用service或dao 创建类,并复制下面代码 再创建TestApp方法 在普通类中获取service或者dao 手动创建工具类 调用配置类 如何通过main方法调用service或dao 大多数情况下,我们使用springboot是创建一个web项目,然后通过接口访问,但是也有特殊情况,比如线上跑着的web项目,有一些特殊的数据,需要经过计算导入到数据库,这个时候,我们可能需要原来的web项目中的一些service,dao才辅助操作,但是又不能在服务端新开接口.我

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

    目录 解决非controller类引用service问题 解决办法 总的代码如下 在非controller层如何调用service层服务 通过init方法进行服务注入 调用方法形式如下 解决非controller类引用service问题 项目中遇到需要采用socket通信机制,由于这个方法没有写在控制类里面,调用service类的时候老是报java.lang.NullPointerException错误 解决办法 1.首先将@Autowired注解注入Service或者Mapper接口  @Au

  • spring controller层引用service报空指针异常nullpointExceptio问题

    目录 调用controller报空指针有两种情况 没有加载到spring容器中 Controller类下的方法private私有了 controller层引用service层报空指针问题 调用controller报空指针有两种情况 1. service 或者mapper 没有加载到spring容器中 ,引用时候肯定报空指针 2. service加载到spring容器中了, 但是controller中定义的方法为private,私有方法被接口访问时候,因为private作用域的问题,无法获取该方法

  • 关于Controller层和Service层的类报错问题及解决方案

    目录 Controller层和Service层的类报错 Controller层和Service层的作用 1.在controller和service里都写那些代码? 2.在整个项目中什么时候加异常?异常怎么处理? Controller层和Service层的类报错 当出现以下这种情况的时候,可以看看pom.xml文件中是否少了jar包. 当我出现这种情况的时候,我去看pom.xml包发现,如不其然我少了一个jar包 这就是我少了的那个jar包(spring-web),把这个加上之后就可以了. <!-

  • SpringBoot开发详解之Controller接收参数及参数校验

    目录 Controller 中注解使用 传输参数的几种Method 获取参数的几种常用注解 使用对象直接获取参数 使用@Valid对参数进行校验 总结 Controller 中注解使用 接受参数的几种传输方式以及几种注解: 在上一篇中,我们使用了JDBC链接数据库,完成了简单的后端开发.但正如我在上文中抛出的问题,我们能不能更好的优化我们在Controller中接受参数的方式呢?这一篇中我们就来聊一聊怎么更有效的接收Json参数. 传输参数的几种Method 在定义一个Rest接口时,我们通常会

  • SpringBoot详解如果通过@Value注解给静态变量注入值

    目录 前序 方案一 方案二 方案三 使用场景 总结 最近做项目的时候,给static变量赋值, 使用 @value注解 ,结果 获取一直为null , 1.spring不允许/不支持把值注入到静态变量中 2.Spring的@Value依赖注入是依赖set方法 3.set方法是普通的对象方法 4.static变量是类的属性,static没有set方法 前序 SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值 例如,application-dev.properti

  • Springboot详解RocketMQ实现消息发送与接收流程

    springboot+rockermq 实现简单的消息发送与接收 普通消息的发送方式有3种:单向发送.同步发送和异步发送. 下面来介绍下 springboot+rockermq 整合实现 普通消息的发送与接收 创建Springboot项目,添加rockermq 依赖 <!--rocketMq依赖--> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-

  • springboot详解整合swagger方案

    目录 1.Swagger简介 2.整合步骤 1.Swagger简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 官网: ( https://swagger.io/ ) 主要作用是: 1. 使得前后端分离开发更加方便,有利于团队协作 2. 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担 3. 功能测试 Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫 Springfox.通过

  • SpringBoot详解整合Redis缓存方法

    目录 1.Spring Boot支持的缓存组件 2.基于注解的Redis缓存实现 3.基于API的Redis缓存实现 1.Spring Boot支持的缓存组件 在Spring Boot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache和org.springframework.cache.CacheManager缓存管理器接口. 如果程序中没有定义类型为CacheManager的Bean组件或者是名为cacheResolve

  • springboot yml定义属性,下文中${} 引用说明

    比如: yml中自定义一个域名属性: mytest: domainName: https://www.jb51.net 上面定义了之后, 在此配置文件中,就可通过 ${} 来代替域名了 defaultHead: ${mytest.domainName}/head.jpeg 补充知识:Java读取.yaml配置文件(使用@Value("${prefix_name}")) 添加lombok依赖 [注]lombok是可选的,但是如果yaml配合lombok使用将非常的方便,代码也很简洁 co

  • springboot详解实现车险理赔信息管理系统代码

    目录 一,项目简介 二,环境介绍 三,系统展示 四,核心代码展示 五,项目总结 一,项目简介 客户的主要功能:个人资料管理,购买的保险信息管理,理赔的申请 事故调查员功能:个人资料管理,事故调查管理,现场勘察管理 管理员功能:个人资料管理,用户管理,理赔审请审核,赔偿金发放管理 二,环境介绍 语言环境:Java: jdk1.8 数据库:Mysql: mysql5.7 应用服务器:Tomcat: tomcat8.5.31 开发工具:IDEA或eclipse 开发技术:后台springboot+sp

随机推荐