java 无法自动导丝,未找到SimpMessagingTemplate类型的Bean

niknxzdl  于 2023-10-14  发布在  Java
关注(0)|答案(5)|浏览(217)

我在Spring中配置Websockets基本上是遵循文档中提供的指南。
我目前正试图从服务器发送一条消息到客户端,如“从任何地方发送消息”一节所述。
按照该示例,您可以自动连接名为SimpMessagingTemplate的类

@Controller
public class GreetingController {

    private SimpMessagingTemplate template;

    @Autowired
    public GreetingController(SimpMessagingTemplate template) {
        this.template = template;
    }

    @RequestMapping(value="/greetings", method=POST)
    public void greet(String greeting) {
        String text = "[" + getTimestamp() + "]:" + greeting;
        this.template.convertAndSend("/topic/greetings", text);
    }

}

但是,我当前的项目找不到bean“SimpMessagingTemplate”。(Intellij:“无法自动连接。未找到SimpMessagingTemplate类型的Bean '。
我在网上查了几个例子,但我找不到如何让Spring创建SimpMessagingTemplate的示例。我如何自动连接它?

编辑:

我决定提供更多的背景信息。这是我当前的WebSocket配置:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:websocket="http://www.springframework.org/schema/websocket"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/websocket
        http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd">

        <!-- TODO properties to be read from a properties file -->
        <websocket:message-broker application-destination-prefix="/app">
            <websocket:stomp-endpoint path="/new_session" >
                <websocket:sockjs/>
            </websocket:stomp-endpoint>
            <websocket:simple-broker prefix="/topic"/>
        </websocket:message-broker>
</beans>

WebSocket与此控制器配合使用

@Controller
public class SessionController {

    private static final Logger log = LoggerFactory.getLogger(SessionController.class);

    @MessageMapping("/new_session")
    @SendTo("/topic/session")
    public SessionStatus newSession(Session session) throws Exception {
    Thread.sleep(3000); // simulated delay
    log.info("Response sent !!");
    return new SessionStatus("StatusReport, " + session.toString() + "!");
    }
}

我只是不知道该怎么做

public class SessionController {

    private static final Logger log = LoggerFactory.getLogger(SessionController.class);

    private SimpMessagingTemplate template;

    @Autowired
    public SessionController(SimpMessagingTemplate template) {
    this.template = template;
    }

}

因为没有找到bean“SimpMessagingTemplate template”。Spring文档没有提供关于这个问题的更多细节。

EDITgithub工作代码示例

7vhp5slm

7vhp5slm1#

我也遇到了同样的问题,错误发生是因为我的WebSocket配置文件:

@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

}

没有被Spring扫描。
因此,修复方法是将具有此配置文件的包添加到扫描的包中。

guykilcj

guykilcj2#

奇怪的是,当您使用WebSocket命名空间时,“message-broker”元素会导致创建一个可用于注入的WebSocket MessagingTemplate bean。控制器和WebSocket命名空间是否都在同一个ApplicationContext中,或者可能一个在“根”上下文中,另一个在DispatcherServlet上下文中?

2vuwiymt

2vuwiymt3#

您应该在applicationContextxml中有一个与类名同名的bean定义id,或者在注入类时注解@Component以使Autowire工作

<bean id="SimpMessagingTemplate " class="your-class" >

您可能需要在下面定义指向您的包的标记,以备以后使用

<context:component-scan base-package="com.x.y"/>
vql8enpb

vql8enpb4#

罗森是对的。元素的添加将把SimpMessagingTemplate bean添加到注入的上下文中。这必须在web应用根上下文中,而不是Spring DispatchServlet的上下文。例如,在下面的web.xml文件中,message-broker元素应该包含在app-root.xml文件中。仅在app-mvc.xml中包含将导致NoSuchBeanDefinitionException。

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/app-root.xml</param-value>
</context-param>

<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring/app-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
huus2vyu

huus2vyu5#

在我的例子中,我通过将Spring-Boot-Starter-Websocket的依赖项添加到pom.xml来修复错误。尽管我已经在类中导入了XML MessagingTemplate,但它仍然需要pom.xml中的依赖项:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

相关问题