如何在我的websocketConfig中使用dbRepository?

时间:2018-11-19 03:40:21

标签: spring spring-boot websocket spring-data-jpa spring-data

我想在实现WebSocketConfig的{​​{1}}中使用我的tokenRepository

在我的控制器中,我可以通过WebSocketMessageBrokerConfigurer websocketConfig`无法获得tokenRepository

我在用户连接网络套接字时覆盖@Autowired, but中的configureClientInboundChannel来获取数据

WebSocketConfig

WebSocketConfig

@Override public void configureClientInboundChannel(ChannelRegistration registration) { logger.debug(">>>[CONFIG CLIENT INBOUND CHANNEL]"); registration.interceptors(new SelfChannelInterceptor()); }

SelfChannelInterceptor

保存在数据库中以供验证的令牌数据。

但是我怎么能让@Override public Message<?> preSend(Message<?> message, MessageChannel channel) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); if (StompCommand.CONNECT.equals(accessor.getCommand())) { String token = accessor.getNativeHeader("token").get(0); String id = accessor.getNativeHeader("id").get(0); if (!validConnection(token, id)){ throw new IllegalArgumentException("No permission to this connection"); } } return message; } 得到WebSocketConfig

tokenRepository中检查数据库的示例

tokenController

1 个答案:

答案 0 :(得分:0)

大家好,我找到了解决此问题的方法。

我使用CompletableFuture让SelfChannelInterceptor获取我在@Autowired中的WebSocketConfig

WebSocketConfig

private CompletableFuture<ServiceImpFactory> completableFutureService = new CompletableFuture<>();

@PostConstruct
public void postConstruct() {
    completableFutureService.complete(this.serviceImpFactory);
}

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
    logger.debug(">>>[CONFIG CLIENT INBOUND CHANNEL]");
    registration.interceptors(new SelfChannelInterceptor(completableFutureService));
}

SelfChannelInterceptor中,我可以使用CompletableFuture.get()来获取想要传递给的内容

SelfChannelInterceptor

@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
    StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

    ServiceFactory serviceFactory = serviceImpFactoryCompletableFuture.get();

    return message;
}

我认为websocketConfig可能会添加一些aspect来调用此类中的方法。 因此,方法configureClientInboundChannel将在第一次运行。但是如何在interface上添加AOP?因为我实现了WebSocketMessageBrokerConfigurer

如果有任何方法可以删除aspect或以后再做,我将继续搜索。