gpt4 book ai didi

java - 如何处理 Jackson 与 Camel REST DSL 绑定(bind)的异常?

转载 作者:行者123 更新时间:2023-12-01 11:54:07 25 4
gpt4 key购买 nike

我正在使用 Camel 2.14.1 构建一些 RESTful 服务,这些服务使用 Camel REST DSL 的 Jackson json 绑定(bind)功能。这工作得很好,但我希望能够在绑定(bind)过程中出现问题时向客户端发送自定义响应。

例如,如果在将输入字符串值转换为整数时抛出 NumberFormatException,因为客户端错误地发送了非数字字符。此异常不是 Jackson 特定的异常,因此我无法捕获它以使用绑定(bind)失败消息回复客户端,因为它可能是合法的内部错误。

类似地,我想捕获 json 入站绑定(bind)到 POJO 期间引发的任何其他异常,并以类似的方式处理这些异常,至少通知客户端其有效负载无效。

由于这一切都是在我的代码“之上”处理的,因此我看不到如何轻松处理此类错误,因为它们都是在我无法控制的库中处理的。我正在使用 Camel 的 onException 子句来处理我自己的异常,所以我知道这一点,只是不确定如何准确地实现我需要的...

最坏的情况,我想我可以将每个客户端输入作为字符串并自己绑定(bind)它,但这似乎违背了 Jackson 的观点。

tl;博士:Camel 中是否有一种模式允许我在 Jackson 的 POJO 绑定(bind)失败时使用 REST DSL 返回自定义响应?

编辑 -这是一些伪代码来说明我想要做什么:

class errorHandler {

void handleException(Exchange exchange, @ExchangeException Exception exception) {

if (myException.class.isAssignableFrom(exception.getClass())) {
// Set exchange body and response code header
// This works as expected, though could probably do this more nicely
}

else if (camelBindingOrJacksonBindingException) {
// Some other custom handling like above, but specific for these exception types
}

else {
// Generic catch all with generic error response body
// This also works fine
}
}
}

目前,我最终在最后的 else block 中捕获了绑定(bind)/ jackson 异常,这就是我试图避免的,因为实际上,让客户端知道他们的输入无效会更有用。这似乎与下面 isaac.hazan 的答案相同。

这样做的问题是,我无法找到 Jackson 绑定(bind)异常是否有一个我可以捕获的父类、所有此类可能异常的列表,或者一种告诉它来自绑定(bind)的方法。

第二个问题是,当 Camel 需要从方法上的绑定(bind)注释中获取 int 时(例如:@Header int number),我无法判断是否存在 Camel 绑定(bind)异常,例如 NumberFormatException ,真正来自 Camel,或者来 self 自己的代码。非常不愿意捕获任何旧的 NumberFormatException 因为如果进一步的内部更改可能引发此问题,我最终会返回错误的响应。是否有某种方法可以找出异常来自何处(是否是在绑定(bind)时)?

最佳答案

我在我的一个应用程序中遇到了类似的问题。我通过使用专用处理器来解决这个问题,该处理器具有针对每种异常类型的方法。

例如,您可以有以下 2 个处理程序,一个作为特定异常,另一个用于任何其他异常:

    <onException id="handleAmazonServiceException">
<exception>com.amazonaws.AmazonServiceException</exception>
<handled><constant>true</constant></handled>
<bean ref="errorHandlerProcessor" method="handleAmazonServiceException" />
<setHeader headerName="CamelFileName">
<simple>{{local.failed.records.dir}}/${header.S3Prefix}/${date:now:yyyy-MM-dd}/${header.failedRecordFileName}</simple>
</setHeader>
<to id="failedRecordsFile" uri="ref:s3FailedRecordsEndpoint" />
</onException>

<onException id="handleGeneralException">
<exception>org.apache.camel.CamelExecutionException</exception>
<exception>java.lang.Exception</exception>
<handled><constant>true</constant></handled>
<bean ref="errorHandlerProcessor" method="handleGeneralException" />
<setHeader headerName="CamelFileName">
<simple>{{local.failed.records.dir}}/${header.S3Prefix}/${date:now:yyyy-MM-dd}/${header.failedRecordFileName}</simple>
</setHeader>
<to id="failedRecordsFile" uri="ref:s3FailedRecordsEndpoint" />
</onException>

上面的关键是“errorHandlerProcessor”bean,它负责处理任何类型的异常。这是从一个地方处理所有错误的简单方法。

看起来像这样:

@Service(value = "errorHandlerProcessor")
public class ErrorHandlerProcessor
{
// General handler
public void handleGeneralException(Exchange exchange)
{
Throwable caused = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
logger.error("An unexpected error camel error occurred:" + caused.getMessage());
logger.debug("Caught exception within the camel engine:", caused);
...
}

//AmazonClientException handler
public void handleAmazonClientException(Exchange exchange)
{
AmazonClientException caused = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, AmazonClientException.class);
StringBuffer errorMessage = new StringBuffer();
errorMessage.append("AmazonClientException,AWS communication problem, Error Message: " + caused.getMessage());
...
}
}

关于java - 如何处理 Jackson 与 Camel REST DSL 绑定(bind)的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28567540/

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