Как я могу использовать dbRepository в моем websocketConfig? - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу использовать свой tokenRepository в моем WebSocketConfig, который реализует WebSocketMessageBrokerConfigurer

В моем контроллере я могу получить tokenRepository на @Autowired, but websocketConfig` не может

Я переопределяю 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 для проверки db

private JwtRepository jwtRepository;

private TokenService tokenService;

@Autowired
public TokenController(TokenRepository tokenRepository){

    jwtRepository = new JwtRepository("xxxxxxx", "yyyyyyy");

    tokenService = new TokenService(tokenRepository);

}

@GetMapping(path = "/all")
public @ResponseBody Iterable<Token> getAll(){

    List<Token> tokens = tokenService.getAllTokens();

    return tokens;
}

1 Ответ

0 голосов
/ 21 ноября 2018

Привет всем, я нашел способ решить эту проблему.

Я использую 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 будет запущен в первый раз. Но как добавить AOP на interface? Потому что я реализую WebSocketMessageBrokerConfigurer

Я буду продолжать поиск, если есть способ удалить aspect или сделать это позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...