java - 如何将属性注入(inject)到 WebSocketHandler 中?

标签 java dependency-injection spring-boot spring-java-config

我在为通过 PerConnectionWebSocketHandler 使用的实现 WebSocketHandler 的类进行简单属性注入(inject)时遇到问题。

这个示例在没有 @Value 注释字段的情况下工作正常,但是当我添加 @Value 注释字段时,当 Web 套接字连接时它会失败: java.lang.IllegalStateException:未找到 StandardWebSocketSession 的 WebSocketHandler

如何在 MyHandler 类中注入(inject) @Value 字段?

应用程序.java

@SpringBootApplication
@RestController
@EnableWebSocket
public class App implements WebSocketConfigurer {

    @Autowired
    private BeanFactory beanFactory;

    public static void main(String [] args){
        SpringApplication.run(App.class, args);
    }

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myHandler(), "/test").setAllowedOrigins("*");
    }

    @Bean
    public WebSocketHandler myHandler() {
        PerConnectionWebSocketHandler perConnectionWebSocketHandler = new PerConnectionWebSocketHandler(MyHandler.class);
        perConnectionWebSocketHandler.setBeanFactory(beanFactory);
        return perConnectionWebSocketHandler;
    }
}

MyHandler.java

@Component
public class MyHandler implements WebSocketHandler{

    /* This causes exception
    @Value("${injectioneexample}")
    private String injectionExample;
    */

    @Override
    public void handleMessage(WebSocketSession session,
            WebSocketMessage<?> encodedMessage) throws Exception {
        if (encodedMessage instanceof org.springframework.web.socket.TextMessage) {
            org.springframework.web.socket.TextMessage castedTextMessage = (org.springframework.web.socket.TextMessage) encodedMessage;
            String message = castedTextMessage.getPayload();
            session.sendMessage(new org.springframework.web.socket.TextMessage(message));
            System.out.println(message);
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession arg0, CloseStatus arg1)
            throws Exception {
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession arg0)
            throws Exception {
        //System.out.println("connected " + injectionExample);
    }

    @Override
    public void handleTransportError(WebSocketSession arg0, Throwable arg1)
            throws Exception {
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }
}

应用程序属性

injectionexample=injected

最佳答案

WebSocketHandler 类中的属性名称存在拼写错误。

@Value("${injectioneexample}")
private String injectionExample;

请注意与您在 application.properties 文件中定义的方式相比,额外的 e

injectionexample=injected

关于java - 如何将属性注入(inject)到 WebSocketHandler 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667797/

相关文章:

java - 从 Spring rest api 返回列表

java - Spring Boot 记录到文件不起作用

java - Vaadin 在 StreamResource 回调方法中缺少 SpringSecurityContext

java - 2 boolean 检查不兼容

java - 在 XSLT 中得到错误的输出?

java - 获取 XSD 验证失败的元素的对象

java - 当父类(super class)使用@Inject时,如何构造一个类?

java - 过滤具有可为空值的列表

asp.net-mvc - 如何将 IoC 成员资格提供程序与 ASP.NET MVC 集成

c# - 使用 Ninject,我可以在不公开具体类的情况下从接口(interface)创建实例吗?