好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

解决非controller类引用service问题

项目中遇到需要采用socket通信机制,由于这个方法没有写在控制类里面,调用service类的时候老是报java.lang.NullPointerException错误

解决办法

1、首先将@Autowired注解注入Service或者Mapper接口

?

1

2

  @Autowired

    PaUserService pauserService;

2、设置静态变量

?

1

private static DomSocketUtils domSocketUtils;

3、初始化静态变量,注意要添加 @PostConstruct注解

?

1

2

3

4

  @PostConstruct   //用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化

    public void init() {

        domSocketUtils = this ;

    }

总的代码如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

@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方法进行服务注入

?

1

2

3

4

5

6

7

8

9

10

11

12

@Slf4j

@Component

public class ServerIOT {

    @Resource

    private EasybandDateService easybandDateService;

    @PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作

    public void init() {

        serverIOT = this ;

        serverIOT.easybandDateService = this .easybandDateService;

        // 初使化时将已静态化的easybandDateService实例化

    }

}

调用方法形式如下

在前面添加当前类就可以了

?

1

boolean save = serverIOT.easybandDateService.save(easybandDate);

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

原文链接:https://blog.csdn.net/xiexiangyan/article/details/111885136

查看更多关于springboot如何解决非controller类引用service的问题的详细内容...

  阅读:14次