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

标签 rest error-handling apache-camel dsl

我正在使用“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/

相关文章:

php - PHP本地服务器-两次错误-错误还是没有?

apache-camel - Camel 组播异常传播

java - 在 net.sf.saxon.event.ReceivingContentHandler.startPrefixMapping 处出现 NullPointerException(ReceivingContentHandler.java :291)

mysql - 如何处理 CAMEL jdbc 连接异常?

http - 依赖 REST API 集合链接

web-services - 通过 symfony2 休息进行身份验证

python - 有人可以帮助我找出我的代码中的错误吗?

java - 从 Jersey 迁移到 spring-mvc/rest : ContainerRequestFilter, ContainerResponseFilter

rest - 在 URL 中使用动词是否与 REST 根本不兼容?

c++ - 模板无法将函数定义与现有声明匹配