Установить ответ Http: InboundGateway StatusCode в Spring Integration Java DSL

Следующий фрагмент конфигурации принимает HTTP POST с телом запроса JSON для создаваемого экземпляра User, но мне страшно, если я смогу заставить его вернуть 201 Created. Любые идеи?

@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();
}

Я пытался позвонить statusCodeFunction на HttpRequestHandlerEndpointSpec, но, должно быть, делаю это неправильно.


person EngineerBetter_DJ    schedule 02.10.2017    source источник
comment
Я исправил это, просто заменив Http.inboundGateway на Http.inboundChannelAdapter. Может ли кто-нибудь пролить свет на то, почему он отвечает статусом http и когда я могу использовать / не использовать inboundGateway через inboundChannelAdapter?   -  person johnwick0831    schedule 09.11.2018


Ответы (1)


Ответ заключался в том, что statusCodeFunction работает только для входящих адаптеров (то есть вещей, которые являются односторонними на пути внутрь). Типа напрашивается вопрос, почему я могу вызвать его на шлюзе, но хм ...

Использование enrichHeaders на IntegrationFlow помогло.

@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();
    }
}
person EngineerBetter_DJ    schedule 02.10.2017
comment
Ах! Хороший улов! Да, действительно, код состояния полностью связан с ответом. Подобно тому, как мы делаем ResponseEntity вместе с его status, то же самое применяется здесь к ответу. Итак, да, заголовок HttpHeaders.STATUS_CODE должен быть установлен. - person Artem Bilan; 02.10.2017
comment
У меня точно такой же код, но я все еще не получаю ответа в течение тайм-аута - person johnwick0831; 09.11.2018