Как я могу преобразовать свой объект из моего канала (Spring-Integration, DSL)? - PullRequest
1 голос
/ 27 июня 2019

У меня есть Integrationflow, который возвращает мне сообщение, и теперь я хотел бы проверить его во втором канале, а после отправки обратно я хотел бы преобразовать его. Но преобразование не удалось.

@Bean
    public IntegrationFlow httpUserGetUserByUsername() {
        return IntegrationFlows.from(httpGetGateUsersGetUserByUsername())
                .channel("http.users.getUserByUsername").handle("userEndpoint", "getUserByUsername")
                .channel("http.users.checkUserAuth").handle("userEndpoint","checkUserByUsername")
                .transform(User u -> new UserResponseHelper(u))
                .get();
    }
public void checkUserByUsername(Message<User> msg) {
        MessageChannel replayChannel = (MessageChannel) msg.getHeaders().getReplyChannel();
        User u = msg.getPayload();
        if (Authorization.isAllowByUsername(u.getUsername())) {
            replayChannel.send(MessageBuilder.withPayload(u).build());
        }else{
            replayChannel.send(MessageBuilder.withPayload(new ResponseEntity(new ApiResponse(HttpStatus.FORBIDDEN,false,"You are not allow to get this ressource"), HttpStatus.FORBIDDEN)).build());
        }
    }

1 Ответ

0 голосов
/ 28 июня 2019

Я получаю пользователя со всеми 8 свойствами и что я ожидаю, это пользователь с 4 реквизитами

OK. Я вижу в чем твоя проблема. Вы действительно только что пропустили тот факт, что ваш .transform(User u -> new UserResponseHelper(u)) вообще не вызывается. То, что твоя «трансформация не удалась», смутило меня.

Итак, что здесь происходит:

  1. Ваш void checkUserByUsername(Message<User> msg) возвращает void. Поэтому нечего заключать в вывод Message. И отсюда ничто не вызовет следующего .transform() в вашем потоке.

  2. Что вы видите для своей службы REST, что все из этого checkUserByUsername(Message<User> msg) отправляется в заголовок replyChannel - место, где Inbound Gateway ожидает ответа.

  3. В случае сбоя проверки вы отправляете несколько пользовательских ApiResponse. Почему бы просто не бросить Exception, например ResponseStatusException? Это будет правильно обработано на уровне REST и возвращено клиенту REST как ошибка.

Я предлагаю вам действительно вернуть u из этого checkUserByUsername() метода и вызвать исключение в противном случае. Таким образом, объект User придет к вашему .transform(User u -> new UserResponseHelper(u)) - и все хорошо!

Вы только что запутались, что void не запускает преобразование, а replyChannel просто для отправки ответа непосредственно в шлюз инициатора.

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