java - 多个动态 HTTP 端点

标签 java spring spring-boot spring-integration

我想运行多个 HTTP 端点,这些端点应根据路径列表创建。

目前我可以创建一个端点:

@MessagingGateway(defaultRequestChannel = "requestChannel")
public interface Gateway {
    String sendReceive(String in);
}

@Bean
public MessageChannel requestChannel() {
    return new DirectChannel();
}

@Bean
public IntegrationFlow flow() {
    return IntegrationFlows.from("requestChannel").transform(new ObjectToStringTransformer())
            .handle(new MyHandle())
            .get();
}

@Bean
public HttpRequestHandlingMessagingGateway httpGate() {
    HttpRequestHandlingMessagingGateway gateway = new HttpRequestHandlingMessagingGateway(true);
    RequestMapping mapping = new RequestMapping();
    mapping.setMethods(HttpMethod.POST);
    mapping.setPathPatterns("/path");
    gateway.setRequestMapping(mapping);
    gateway.setRequestChannel(requestChannel());
    gateway.setRequestPayloadType(byte[].class);
    return gateway;
}

但我想做这样的事情:

@Autowired
List<String> paths;

@PostConstruct
public void createEndpoints() {
    for (String path : paths) {
        //code for dynamic endpoint creation
    }
}

private class MyHandle extends AbstractReplyProducingMessageHandler {

    @Override
    protected Object handleRequestMessage(Message<?> requestMessage) {
        return this.getMessageBuilderFactory().withPayload("Your message: " + requestMessage.getPayload());
    }
}

你能告诉我该怎么做吗?

最佳答案

自 Java DSL 1.2 起,就有了一个 IntegrationFlowContext 专门用于动态注册 IntegrationFlow 和依赖 bean 的此类用例。

https://spring.io/blog/2016/09/27/java-dsl-for-spring-integration-1-2-release-candidate-1-is-available

今天发布 GA。

您应该按照这些博客文章中的示例进行操作,并注意 org.springframework.integration.dsl.http.Http 工厂。

但是,事实上,应该尽早这样做。 @PostConstruct 对于这个用例来说是一个很好的阶段。 稍后,HandlerMapping 将无法检测到新的映射。只是因为它在 afterPropertiesSet() 中进行扫描。

关于java - 多个动态 HTTP 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40042366/

相关文章:

java - 在组件之间共享类的实例

java - 使用 spring boot 设置 Redis sentinel

java - 来自 Android 客户端的 HTTP 请求

java - 我无法更改片段着色器中的颜色

java - 有没有办法使用 AES/CBC 在 java/kotlin 中加密并在 Nodejs 中解密?

java - 如何使用 for 循环 Spring Mvc 对父对象中的对象列表进行排序

java - 将 List 中的一个元素的值从 True 更改为 False

java - VisualVM 的 JVM 调用树快照

java - 如何设置ViewingPlatform和更新TransformGroup?

java - Spring 和 AngularJS 位于同一应用程序的不同项目中