当前位置: 首页 > 知识库问答 >
问题:

在Spring集成JavaDSL中设置响应Http: InbordGateway StatusCode

国晟睿
2023-03-14

下面的配置位接受一个HTTP POST,其中包含一个要创建的用户实例的JSON请求体,但如果我能让它返回一个创建的201,我会感到不安。有什么想法吗?

@Bean
public IntegrationFlow flow(UserService userService) {
    return IntegrationFlows.from(
            Http.inboundGateway("/users")
            .requestMapping(r -> r.methods(HttpMethod.POST))
            .statusCodeFunction(f -> HttpStatus.CREATED)
            .requestPayloadType(User.class)
            .replyChannel(replyChannel())
            .requestChannel(inputChannel())
        )
        .handle((p, h) -> userService.create((User) p)).get();
}

我尝试在HttpRequest estHandlerEndpoint Spec上调用statusCodeFunction,但我一定是做错了。


共有1个答案

樊杰
2023-03-14

答案是,statusCodeFunction只适用于入站适配器(即单向的)。有点回避的问题是,为什么我可以在网关上调用它,但呵呵。。。

在集成流(IntegrationFlow)上使用丰富头文件(enrichHeaders)实现了这个技巧。

@Configuration
@EnableIntegration
@Profile("integration")
public class IntegrationConfiguration {
    @Autowired
    UserService userService;

    @Bean
    public DirectChannel inputChannel() {
        return new DirectChannel();
    }

    @Bean
    public DirectChannel replyChannel() {
        return new DirectChannel();
    }

    @Bean
    public HttpRequestHandlingMessagingGateway httpGate() {
        HttpRequestHandlingMessagingGateway gateway = new HttpRequestHandlingMessagingGateway(true);
        RequestMapping requestMapping = new RequestMapping();
        requestMapping.setMethods(HttpMethod.POST);
        requestMapping.setPathPatterns("/users");
        gateway.setRequestPayloadType(User.class);
        gateway.setRequestMapping(requestMapping);
        gateway.setRequestChannel(inputChannel());
        gateway.setReplyChannel(replyChannel());
        return gateway;
    }

    @Bean
    public IntegrationFlow flow(UserService userService) {
        return IntegrationFlows.from(httpGate()).handle((p, h) -> userService.create((User) p))
                .enrichHeaders(
                        c -> c.header(org.springframework.integration.http.HttpHeaders.STATUS_CODE, HttpStatus.CREATED))
                .get();
    }
}
 类似资料:
  • 当msg处理抛出异常时,如何有效地支持JMS重新交付? 我有一个使用JMS(ActiveMQ)的流,它具有配置为允许n次重新传递尝试的连接工厂。 我希望在处理msg时出现任何错误,导致msg在connectionFactory配置允许的情况下被放回重新交付,然后在最大重新交付尝试用尽时,交付给DLQ。与AMQ保持一致。 对一个相关SO问题的回答意味着我可能会有一个重新抛出的错误通道,它应该触发重新

  • 在spring integration (Java DSL)中,如何定义一个完整流程的事务? 通过Spring集成,我们可以定义一个示例流程: 我需要一个跨度整个流程的交易。目前,当我使用“aMessage转换器”访问数据库时,事务将在处理完此消息转换器后关闭。但是我需要一个在处理“另一个消息转换器”时仍未提交的事务? 我希望只需添加一个“@Transactional”(或@Transaction

  • 我遵循下面的示例来实现spring集成网关。 问题:无法从服务激活器发送的网关上获得响应。 网关应答通道是"最佳应答通道"。 服务激活器写入同一个通道。 所有的自定义方法都被执行,响应被组成,但是从来没有被发送出去。知道这里缺少什么吗?我的配置在流程中也有一个分散收集。

  • 这里是我的拦截器方法,我想在这里设置自定义响应,告诉UI发生了什么 并且在web.xml中 spring-servlet.xml 当会话超时时,它在返回false后不发送任何响应。连下面的都不行

  • 我正在尝试做一个GroupBy基于共享ID的GeoJSON功能列表,以便通过使用拆分/聚合来聚合这些功能的单个字段,如下所示: 除非我取消对这三行的注释,否则聚合器永远不会发布组,数据库也不会收到任何更新。如果我将groupTimeout设置为小于5秒,则会丢失部分结果。 我预计发布策略默认为,我预计在处理完所有(拆分)功能后会自动释放所有组(REST服务消息中总共只有129个功能)。手动将其设置

  • 这是使用注释代码示例的Spring集成执行器通道的后续问题。 我试图通过在“公共频道”中发布一条消息并阅读味精中设置的REPLY_CHANNEL来测试用红色突出显示的框。 “公共通道”是发布-订阅通道。REPLY_通道是一个队列通道。 由于这是一个JUnit测试,我已经模拟了jdbcTemboard、数据源和Impl以忽略任何DB调用。 我的问题是:当我在“公共频道”上发布消息时,我在REPLY\