SpringBoot在自定义类中调用service层等Spring其他层

背景:
做了一个TCP服务器来接入智能设备,然后需要将设备实时发送的定位等关键信息存储到数据库。为了考虑将来可能对外提供rest接口,采用将TCP服务器集成到SpringBoot框架,当然,也是为了能最快利用mybatis框架实现数据访问,然后依次解决了如何启动,如何注销等各种问题,然后在TCP服务器消息处理时,需要写数据库,直接调用DAO层,编译报错。改为调用Service层,编译正常,运行到调用的地方,报空指针异常,跟踪到异常位置,发现service为空,也就是按照之前controller层通过@Autowired注入service层失效。
解决方案:
1.上代码

@Component
public class ServerHandler extends IoHandlerAdapter {
   
   
    @Autowired
    protected HealthDataService healthDataService;
    private static ServerHandler  serverHandler ;
    @PostConstruct 
### 如何在Spring Boot中通过WebSocket调用Service的方法 为了实现通过WebSocket调用服务方法,在Spring Boot应用程序中可以采用以下几种方式: #### 使用`@MessageMapping` 定义带有`@Controller`或`@RestController`注解的类来处理传入的消息。对于特定消息映射,使用`@MessageMapping`指定路径模式匹配。当接收到与该模式相匹配的消息时,会触发相应的方法执行。 ```java @Controller public class MyWebSocketController { private final MyService myService; public MyWebSocketController(MyService myService) { this.myService = myService; } @MessageMapping("/call-service-method") public void handleCallServiceMethod(String payload) throws Exception { // 调用服务逻辑 myService.someBusinessLogic(payload); } } ``` 此配置允许客户端发送到服务器端点 `/app/call-service-method` 的消息被路由至 `handleCallServiceMethod()` 方法,并进一步调用了注入的服务实例中的业务逻辑函数[^1]。 #### 配置WebSocket支持 确保已启用STOMP协议的支持并注册了必要的拦截器和通道处理器。这通常是在配置类中完成的,如下所示: ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws").withSockJS(); } } ``` 上述设置启用了简单的内存代理用于广播更新给订阅者(前缀为`/topic`),并将应用级别的目的地限定词设为`/app`。同时开放了一个名为`/ws`的终端供前端连接[^2]。 #### 客户端交互示例 假设有一个HTML页面作为前端部分,则可以通过JavaScript库如SockJS和stomp.js建立连接并向后端推送数据: ```html <script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/stomp-websocket/lib/stomp.min.js"></script> <script type="text/javascript"> var socket = new SockJS('/ws'); var stompClient = Stomp.over(socket); stompClient.connect({}, function(frame) { console.log('Connected: ' + frame); stompClient.send("/app/call-service-method", {}, JSON.stringify({message:"Hello"})); }); </script> ``` 这段脚本展示了如何创建一个新的Socket连接并通过它向服务器发送一条携带有效载荷的消息。一旦成功建立了连接,就可以利用`send()`方法传递自定义命令以激活相应的控制器动作[^3]。
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值