Spring 弹簧踩踏websocket订阅映射不工作

Spring 弹簧踩踏websocket订阅映射不工作,spring,websocket,kotlin,stomp,Spring,Websocket,Kotlin,Stomp,我正在尝试在spring boot应用程序中为stomp over WebSocket配置订阅映射,但没有任何运气。我很确定我已经正确配置了stomp/websocket,因为我可以订阅卡夫卡消费者发布到的主题,但是使用@SubscribeMapping根本不起作用 这是我的控制器 @Controller class TestController { @SubscribeMapping("/topic/test") fun testMapping(): String {

我正在尝试在spring boot应用程序中为stomp over WebSocket配置订阅映射,但没有任何运气。我很确定我已经正确配置了stomp/websocket,因为我可以订阅卡夫卡消费者发布到的主题,但是使用@SubscribeMapping根本不起作用

这是我的控制器

@Controller
class TestController {
    @SubscribeMapping("/topic/test")
    fun testMapping(): String {
        return "THIS IS A TEST"
    }
}
这是我的配置

@Configuration
@EnableWebSocketMessageBroker
@Order(Ordered.HIGHEST_PRECEDENCE + 99)
class WebSocketConfig : AbstractWebSocketMessageBrokerConfigurer() {

    override fun configureMessageBroker(config: MessageBrokerRegistry) {
        config.setApplicationDestinationPrefixes("/app", "/topic")
        config.enableSimpleBroker("/queue", "/topic")
        config.setUserDestinationPrefix("/user")
    }

    override fun registerStompEndpoints(registry:StompEndpointRegistry) {
        registry.addEndpoint("/ws").setAllowedOrigins("*")
    }

    override fun configureClientInboundChannel(registration: ChannelRegistration?) {
        registration?.setInterceptors(object: ChannelInterceptorAdapter() {
            override fun preSend(message: Message<*>, channel: MessageChannel): Message<*> {
                val accessor: StompHeaderAccessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor::class.java)
                if (StompCommand.CONNECT.equals(accessor.command)) {
                    Optional.ofNullable(accessor.getNativeHeader("authorization")).ifPresent {
                        val token = it[0]
                        val keyReader = KeyReader()
                        val creds = Jwts.parser().setSigningKey(keyReader.key).parseClaimsJws(token).body
                        val groups = creds.get("groups", List::class.java)
                        val authorities = groups.map { SimpleGrantedAuthority(it as String) }
                        val authResult = UsernamePasswordAuthenticationToken(creds.subject, token, authorities)
                        SecurityContextHolder.getContext().authentication = authResult
                        accessor.user = authResult
                    }
                }
                return message
            }
        })
    }
}
像这样订阅我知道正在发送数据的主题效果很好,但subscribemapping什么都不做。我还尝试将事件侦听器添加到我的websocket配置中,以测试UI是否实际向后端发送订阅事件,如下所示:

this.stompService.subscribe('/topic/test')
      .map(data => data.body)
      .subscribe(data => console.log(data));
    @EventListener
    fun handleSubscribeEvent(event: SessionSubscribeEvent) {
        println("Subscription event: $event")
    }

    @EventListener
    fun handleConnectEvent(event: SessionConnectEvent) {
        println("Connection event: $event")
    }

    @EventListener
    fun handleDisconnectEvent(event: SessionDisconnectEvent) {
        println("Disconnection event: $event")
    }
添加这些事件监听器后,我可以看到我期望从UI中获得的所有事件都在kotlin层中通过,但我的控制器方法从未被调用。有什么明显的遗漏吗?

尝试以下方法:

@Controller
class TestController {

    @SubscribeMapping("/test")
    fun testMapping(): String {
        return "THIS IS A TEST"
    }
}
请尝试以下操作:

@Controller
class TestController {

    @SubscribeMapping("/test")
    fun testMapping(): String {
        return "THIS IS A TEST"
    }
}

你是个救生员谢谢你。我不知道为什么会这样。我昨天一整天都在尝试不同的变化。我认为我遇到的问题是,我最初尝试的控制器有一个RestController注释。我想您不能将Get/Put/Post映射与SubscribeMapping混合使用。看到intellij在那个断点处停止,我的早上很兴奋。
/topic
将被隐式添加到您提供的URL中。很高兴我为你做了一个早晨:)你是个救生员谢谢。我不知道为什么会这样。我昨天一整天都在尝试不同的变化。我认为我遇到的问题是,我最初尝试的控制器有一个RestController注释。我想您不能将Get/Put/Post映射与SubscribeMapping混合使用。看到intellij在那个断点处停止,我的早上很兴奋。
/topic
将被隐式添加到您提供的URL中。很高兴我为你创造了一个早晨:)