我有一个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());
}
}
答案 0 :(得分:0)
我为用户提供了全部8种属性,并期望用户拥有4种道具
好。我知道你怎么了您真的错过了根本没有调用.transform(User u -> new UserResponseHelper(u))
的事实。因此,您的“转换失败”使我感到困惑。
那么,这是怎么回事:
您的void checkUserByUsername(Message<User> msg)
返回void
。因此,没有任何内容可以包装到输出Message
中。从这里开始,什么也不会触发下一个.transform()
。
对于REST服务,您看到的是checkUserByUsername(Message<User> msg)
中的所有内容都发送到replyChannel
标头-入站网关等待答复的地方。
如果验证失败,则发送一些自定义ApiResponse
。为什么不扔一个Exception
,例如ResponseStatusException
?这将在REST层上正确处理,并作为错误返回给REST客户端。
我建议您从此u
方法中真正返回该checkUserByUsername()
,否则抛出异常。这样,User
对象就会到达您的.transform(User u -> new UserResponseHelper(u))
-一切顺利!
您只是对void
不会触发转换而感到困惑,replyChannel
只是用于直接将答复发送到发起方网关。