SpringBoot AutoWired 주입 서비스가 null인 이벤트
3429 단어 서버JavaWebJavaDebug 레코드springboot
문제 설명:
java.lang.NullPointerException
at com.ynd.back.socket.WebSocket.onMessage(WebSocket.java:113)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80)
at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:395)
at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:119)
at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:495)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:294)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Springboot의 웹socket 기능을 사용할 때 서비스 중 하나가 자동으로 주입되는 결과는null입니다. 문제를 파악한 후에 주입이 완료되지 않은 클래스가 있습니다.
솔루션 1:
https://blog.csdn.net/qiangrenpu8881/article/details/82146323
해결 방안 2 및 사건 발생 원인:
spring이나springboot의 웹소켓에서 @Autowired를 사용하여 서비스나 bean을 주입할 때 빈 바늘이 이상하다고 보고합니다. 서비스는null입니다.
해결 방법: 주입할 서비스를static로 바꾸면null이 되지 않습니다.참조 코드:
@Controller
@ServerEndpoint(value="/chatSocket")
public class ChatSocket {
// , service
private static ChatService chatService;
// , service
@Autowired
public void setChatService(ChatService chatService) {
ChatSocket.chatService = chatService;
}
}
주요 원인:
스프링이 관리하는 것은 모두 단일 (singleton)으로 웹소켓 (다중 대상) 과 충돌합니다.상세 설명: 프로젝트를 시작할 때 초기화하면 웹소켓(사용자 연결이 아닌)이 초기화되고spring은 동시에 서비스에 주입됩니다. 이 대상의 서비스는null이 아닙니다. 성공적으로 주입되었습니다.그러나spring이 기본적으로 관리하는 것은 단례이기 때문에 서비스를 한 번만 주입합니다.새로운 사용자가 채팅에 들어갈 때 시스템은 새로운 웹소켓 대상을 만들 것이다. 이때 모순이 생겼다. 스프링이 관리하는 것은 모두 하나의 예이고 두 번째 웹소켓 대상에 서비스를 주입하지 않기 때문에 사용자가 연결하여 만든 웹소켓 대상이라면 더 이상 주입할 수 없다.
컨트롤러에 서비스가 있고 서비스에 다가 있는 것 같아요.controller, 서비스,dao는 모두 단례이기 때문에 주입할 때null에 보고하지 않습니다.그러나 웹소켓은 단례가 아니기 때문에spring을 사용하여 한 번 주입하면 뒤에 있는 대상은 다시 주입하지 않고null에 보고합니다.원문:https://blog.csdn.net/m0_37202351/article/details/86255132 z
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
집 서버 설계 (하드웨어 편)자신의 Redmine이나 ownCloud를 운용하기 위해 사쿠라 VPS, DigitalOcean, OpenShift 등을 놀랐습니다만, 침착 해 왔으므로 현상을 정리하고 싶습니다. 먼저 하드웨어 구성을 정리합니다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.