【问题标题】:Invoke Spring Controller from Spring Integration flow从 Spring Integration 流中调用 Spring Controller
【发布时间】:2018-02-27 21:26:42
【问题描述】:

您好,我有一个小问题。我想手动调用弹簧控制器,但我有一个例外。首先,让我向您展示一些集成流程和控制器:

@Bean
public IntegrationFlow flow() {
    return IntegrationFlows.from(
            Amqp.inboundAdapter(rabbitMqConfig.connectionFactory(), queue)
                    .acknowledgeMode(AcknowledgeMode.MANUAL)
                    .errorChannel("errorChannel")
                    .concurrentConsumers(2)
                    .maxConcurrentConsumers(3))
            .transform(Transformers.fromJson(Event.class))
            .transform(new EventToRequestTransformer())
            .handle(Request.class, (request, headers) -> controller.trigger(request))
            .<ResponseEntity, HttpStatus>transform(ResponseEntity::getStatusCode)
            .routeToRecipients(some routing)
            .get();
}


@Controller
public class SomeController {

    @RequestMapping(value = "/trigger", method = RequestMethod.POST)
    public ResponseEntity<Response> trigger(@RequestBody Request request) 
    {
        //some logic
    }
}

当我运行我的应用程序并发送事件时,我在线上遇到异常:

.handle(Request.class, (request, headers) -> controller.trigger(request))

例外:

嵌套异常是 java.lang.IllegalStateException:未找到线程绑定请求:您是指实际 Web 请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上是在 Web 请求中操作并且仍然收到此消息,则您的代码可能在 DispatcherServlet/DispatcherPortlet 之外运行

有人能告诉我哪里出了问题以及如何解决吗?我想我可以像调用简单 POJO 一样调用控制器方法。

【问题讨论】:

  • 你误用了请求对象吗?

标签: java spring spring-mvc spring-integration spring-integration-dsl


【解决方案1】:

您正在混合关注点并尝试从服务层调用 Web 层。

如果是这样的逻辑,那么应用程序的设计是错误的。

您应该从控制器逻辑中提取一些服务并从 Web 以及集成级别调用它。

根据您的堆栈跟踪,您似乎尝试访问request 范围对象。嗯,这正是@Controller bean 发生的事情,我猜。

【讨论】:

  • 在我们的项目中,我们将控制器替换为消息代理,这是我们两者都有的临时解决方案。我不想复制代码,只是将请求传递给将完成其余工作的控制器。我也认为逻辑提取是一种方法,但我认为也许有一些替代方法。感谢您的评论!
  • 在 Servlet 上下文之外,除了 request 范围之外别无选择。
猜你喜欢
  • 2021-05-29
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
相关资源
最近更新 更多