如何从通道(弹簧集成,DSL)转换对象?

时间:2019-06-27 17:15:16

标签: spring-integration

我有一个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 :(得分:0)

  

我为用户提供了全部8种属性,并期望用户拥有4种道具

好。我知道你怎么了您真的错过了根本没有调用.transform(User u -> new UserResponseHelper(u))的事实。因此,您的“转换失败”使我感到困惑。

那么,这是怎么回事:

  1. 您的void checkUserByUsername(Message<User> msg)返回void。因此,没有任何内容可以包装到输出Message中。从这里开始,什么也不会触发下一个.transform()

  2. 对于REST服务,您看到的是checkUserByUsername(Message<User> msg)中的所有内容都发送到replyChannel标头-入站网关等待答复的地方。

  3. 如果验证失败,则发送一些自定义ApiResponse。为什么不扔一个Exception,例如ResponseStatusException?这将在REST层上正确处理,并作为错误返回给REST客户端。

我建议您从此u方法中真正返回该checkUserByUsername(),否则抛出异常。这样,User对象就会到达您的.transform(User u -> new UserResponseHelper(u))-一切顺利!

您只是对void不会触发转换而感到困惑,replyChannel只是用于直接将答复发送到发起方网关。