gpt4 book ai didi

rest - Apache Camel REST DSL - 验证请求有效负载并返回错误响应

转载 作者:行者123 更新时间:2023-12-04 18:20:06 24 4
gpt4 key购买 nike

我正在使用“CamelHttpTransportServlet”公开一个休息服务,该服务接收订单并放置在 jms 队列中。该代码在快乐路径上运行良好并返回 200 响应。
我编写了 Processor 来验证输入 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 块。

这有什么帮助吗?这可行吗?

最佳答案

我会使用以下代码示例中的内容:

onException(CustomException.class)
.handled(true)
.bean(PrepareErrorResponse.class)
.log("Error response processed");

rest("/ordermanagement")
.post("/order")
.to("direct:checkInput");

from("direct:checkInput")
.process((Exchange exchange) -> {
String requestBody = exchange.getIn().getBody(String.class);
if(requestBody == "" || requestBody== null) {
throw new CustomException(code, jsonObject);
}
})
.to("direct:sendToQ");

from("direct:sendToQ")
.to("jms:queue:orderReceiver")
.log("Sent to JMS");

Camel 将存储在交易所的属性中捕获的任何异常,因此应该可以通过 Exchange.EXCEPTION_CAUGHT 获得。属性键。下面的示例说明了此类自定义错误消息 bean 的外观:

public class PrepareErrorResponse {

@Handler
public void prepareErrorResponse(Exchange exchange) {
Throwable cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);

if (cause instanceof CustomException) {
CustomException validationEx = (CustomException) cause;
// ...
}

Message msg = exchange.getOut();
msg.setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON);
msg.setHeader(Exchange.HTTP_RESPONSE_CODE, 400);

JsonObject errorMessage = new JsonObject();
errorMessage.put("error", "Bad Request");
errorMessage.put("reason", cause.getMessage());
msg.setBody(errorMessage.toString());
// we need to do the fault=false below in order to prevent a
// HTTP 500 error code from being returned
msg.setFault(false);
}
}

Camel 提供了几种实际处理异常的方法。这里介绍的方式只是一个例子。然而,提议的代码允许对不同的捕获异常以及其他内容使用自定义重新传递策略。如果错误可以在异常处理程序中得到解决,则路由将在异常发生时继续执行(即应用重新传递策略的临时网络问题)。如果错误无法在处理程序中得到修复,则交换将停止。通常,人们会将当前处理的消息发送到 DLQ 并记录有关错误的信息。

请注意,此示例将假设 CustomExceptionunchecked exception因为处理器被更简单的 lambda 取代。如果您不能或不想使用这样的异常(或 lambda 表达式),请将 lambda 处理器替换为 new Processor() { @Override public void process(Exchange exchange) throws Exception { ... } }构造。

关于rest - Apache Camel REST DSL - 验证请求有效负载并返回错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49010933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com