SpringBoot AutoWired 주입 서비스가 null인 이벤트

 


문제 설명:

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

좋은 웹페이지 즐겨찾기