【发布时间】:2018-08-07 05:36:06
【问题描述】:
我正在使用“CamelHttpTransportServlet”公开一个休息服务,该服务接收订单并放置在 jms 队列中。该代码在快乐路径上运行良好并返回 200 响应。 我编写了处理器来验证输入 JSON,并根据输入设置 http_response_code。
问题是 - 对于通过失败响应代码的无效请求 - 设置了 400,流程继续到下一个路由并将数据推送到队列,而不是将 400 响应发送回调用应用程序。
rest("/ordermanagement")
.post("/order").to("direct:checkInput");
from("direct:checkInput")
.process(new Processor() {
@Override
public void process(final Exchange exchange) throws Exception {
String requestBody = exchange.getIn().getBody(String.class);
if(requestBody == "" || requestBody== null) {
exchange.getIn().setBody("{ "error": Bad Request}");
exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json");
exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 400);
}
}
})
.to("direct:sendToQ");
from("direct:sendToQ")
.to("jms:queue:orderReceiver")
.log("Sent to JMS");
有人可以告知这里缺少的内容并在可能的情况下提供示例吗?
尝试实现 onException 方法:
rest("/ordermanagement")
.post("/order").to("direct:checkInput");
onException(CustomException.class).handled(true)
.setHeader(Exchange.HTTP_RESPONSE_CODE, code)
.setBody(jsonObject);
from("direct:checkInput")
.process(new Processor() {
@Override
public void process(final Exchange exchange) throws Exception {
String requestBody = exchange.getIn().getBody(String.class);
if(requestBody == "" || requestBody== null) {
throw CustomException(code, jsonObject)
}
}
})
.to("direct:sendToQ");
from("direct:sendToQ")
.to("jms:queue:orderReceiver")
.log("Sent to JMS");
但是我不知道如何将参数 - code,jsonObject 从处理器传递到 onException 块。
对此有任何帮助吗?这可行吗?
【问题讨论】:
-
您是否尝试将
.to("direct:checkInput")替换为.inOut("direct:checkInput")或.to(ExchangePattern.InOut, "direct:checkInput")?我进一步不确定您是否想将错误有效负载真正发送到 JMS 队列,您可以通过将消息正文替换为自定义错误正文来执行此操作。可能抛出一个验证错误并在自己的异常处理程序中处理它是更好的选择,因为队列可能应该只填充有效的订单 -
我需要将错误消息发送给消费者,而不是发送给队列。
标签: rest error-handling apache-camel dsl