복붙노트

[SPRING] Spring : SimpMessagingTemplate 빈을 루트 컨텍스트에 노출하는 방법?

SPRING

Spring : SimpMessagingTemplate 빈을 루트 컨텍스트에 노출하는 방법?

스프링 프레임 워크 (스프링 코어, 스프링 mvc, 스프링 보안, 스프링 데이터, 스프링 websocket 등)을 사용하여 Java webapp을 개발 중입니다.

이와 같이 Spring 컨텍스트에서 메시지 브로커를 선언하면 컨텍스트에 SimpMessagingTemplate Bean이 제공됩니다.

<websocket:message-broker>
    <websocket:stomp-endpoint path="/stomp">
        <websocket:sockjs/>
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic,/queue"/>
</websocket:message-broker>

이 태그를 dispatch-servlet.xml (applicationContext.xml이 아님)에 넣어야합니다. 그렇지 않으면 초기 페이지로드시 websocket에 연결하려고 할 때 클라이언트가 404를 얻게됩니다.

그러나 SimpMessagingTemplate 빈을 제공하는이 태그는 루트 컨텍스트에서 사용할 수 없으므로 루트 컨텍스트에 의해 스캔 된 서비스가 websocket 메시지를 전송할 때 SimpMessagingTemplate 빈을 자동으로 사용할 수 없습니다 (클래식 NoSuchBeanDefinitionException ).

이전에는 태그가 applicationContext.xml에 있었고 dispatcher-servlet.xml이 applicationContext.xml을 가져 왔으며 모든 것이 잘 작동했습니다. 그러나 최근에 내가 SessionRegistry를 사용했을 때 이것이 잘못되었다는 사실을 알게되었습니다. 임의의 사용자 세션을 수정합니다.

사실, DispatcherServlet은 명시 적으로 암시 적으로 이미 상속 된 루트 컨텍스트를 명시 적으로 가져 오기 때문에 SessionRegistry Bean이 두 번 만들어져 예기치 않은 동작이 발생합니다 (일반적으로 사용자는이 일반적인 실수를 묘사하는 여러 게시물을 가지고 있습니다. 모든 주체는 SessionRegistry 빈 중복으로 인해 빈 목록을 가져오고 이것에 대해 알아보십시오.

그래서이 문제를 해결하기 위해

<import resource="applicationContext.xml"/>

dispatcher-servlet.xml에서 가져 왔지만 그 이후 :

이것에 대한 해결책은 아마도 흔히있는 문제일까요? DispatcherServlet은 루트 컨텍스트에서 Bean에 액세스 할 수 있지만 그 반대는 불가능하므로 어떻게해야합니까?

해결법

  1. ==============================

    1.나는 더러운 해결책을 발견했다. 나는 그것을 좋아하지 않지만 현재와 이전 동료들뿐 아니라 SO에 대한 답변이 부족하다는 점을 감안할 때 (Dispatcher-servlet도 websocket 요청에 매핑 할 수 없음), 프로젝트를 진행하고 더티를 구현해야했습니다 고치다.

    나는 더러운 해결책을 발견했다. 나는 그것을 좋아하지 않지만 현재와 이전 동료들뿐 아니라 SO에 대한 답변이 부족하다는 점을 감안할 때 (Dispatcher-servlet도 websocket 요청에 매핑 할 수 없음), 프로젝트를 진행하고 더티를 구현해야했습니다 고치다.

    더러운 수정은 Controller와 Scheduled 클래스의 SimpMessagingTemplate을 autowire하고 (모두 websocket 태그가 선언 된 dispatcher-servlet에 의해 검사 됨) SimpMessagingTemplate을 매개 변수로 전달 (루트 컨텍스트에서 선언 됨)하는 것입니다.

    이 솔루션은 투명하지 않습니다 (SimpMessagingTemplate은 서비스에서 자동으로 이상적으로 자동 실행되어야 함). 그러나 문제를 확실히 해결합니다.

  2. from https://stackoverflow.com/questions/34774158/spring-how-to-expose-simpmessagingtemplate-bean-to-root-context by cc-by-sa and MIT license