Spring integration 我如何从我的通道(spring integration,DSL)转换我的对象?

Spring integration 我如何从我的通道(spring integration,DSL)转换我的对象?,spring-integration,Spring Integration,我有一个Integrationflow,它会返回一条消息,现在我想在第二个通道中验证它,在发送回后,我想转换它。 但转型失败了 @Bean public IntegrationFlow httpUserGetUserByUsername() { return IntegrationFlows.from(httpGetGateUsersGetUserByUsername()) .channel("http.users.getUserByUse

我有一个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(消息msg){
MessageChannel replayChannel=(MessageChannel)msg.getHeaders().getReplyChannel();
用户u=msg.getPayload();
if(Authorization.isAllowByUsername(u.getUsername())){
replayChannel.send(MessageBuilder.withPayload(u.build());
}否则{
replayChannel.send(MessageBuilder.withPayload(新的ResponseEntity(新的ApiResponse(HttpStatus.FORBIDDEN,false,“您不允许获取此ressource”)、HttpStatus.FORBIDDEN)).build();
}
}
我得到一个拥有8个属性的用户,而我期望的是一个拥有4个道具的用户

嗯。我知道你有什么问题了。你真的错过了一个事实,你的
.transform(User u->new userresponsehelp(u))
根本没有被调用。所以,你的“转型失败”让我困惑

那么,这里发生了什么:

  • 您的
    void checkUserByUsername(Message msg)
    返回
    void
    。因此,没有任何东西可以包装到输出
    消息中。从这里开始,任何东西都不会触发流中的下一个
    .transform()

  • 您在REST服务中看到的是,从
    checkUserByUsername(Message msg)
    replyChannel
    报头的所有内容都被发送到入站网关等待回复的位置

  • 如果验证失败,您将发送一些自定义的
    ApiResponse
    。为什么不抛出一个
    异常
    ,例如
    ResponseStatusException
    ?这将在REST层上得到正确处理,并作为错误返回给REST客户端

  • 我建议您从这个
    checkUserByUsername()
    方法返回
    u
    ,否则抛出异常。这样,
    用户
    对象将进入您的
    .transform(User u->new userresponsehelp(u))
    -一切都好

    您刚刚混淆了
    void
    不会触发转换,而
    replyChannel
    只是用于直接向启动器网关发送应答

    我得到一个拥有8个属性的用户,而我期望的是一个拥有4个道具的用户

    嗯。我知道你有什么问题了。你真的错过了一个事实,你的
    .transform(User u->new userresponsehelp(u))
    根本没有被调用。所以,你的“转型失败”让我困惑

    那么,这里发生了什么:

  • 您的
    void checkUserByUsername(Message msg)
    返回
    void
    。因此,没有任何东西可以包装到输出
    消息中。从这里开始,任何东西都不会触发流中的下一个
    .transform()

  • 您在REST服务中看到的是,从
    checkUserByUsername(Message msg)
    replyChannel
    报头的所有内容都被发送到入站网关等待回复的位置

  • 如果验证失败,您将发送一些自定义的
    ApiResponse
    。为什么不抛出一个
    异常
    ,例如
    ResponseStatusException
    ?这将在REST层上得到正确处理,并作为错误返回给REST客户端

  • 我建议您从这个
    checkUserByUsername()
    方法返回
    u
    ,否则抛出异常。这样,
    用户
    对象将进入您的
    .transform(User u->new userresponsehelp(u))
    -一切都好


    您刚才感到困惑的是,
    void
    不会触发转换,
    replyChannel
    只是用于直接向启动器网关发送应答。

    转换是如何失败的?不幸的是你没有和我们分享这些信息。。。你期望什么,什么不起作用?我将得到整个用户对象,但我只想得到一些属性,如名称、角色。我得到了一个拥有8个属性的用户,我所期望的是一个拥有4个属性的用户,转换是如何失败的?不幸的是你没有和我们分享这些信息。。。你期望什么,什么不起作用?我将得到整个用户对象,但我只想得到一些属性,如名称、角色。我得到一个拥有8个属性的用户,而我期望的是一个拥有4个道具的用户
    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());
            }
        }