建立响应时处理JsonProcessingException,但业务逻辑已完成

时间:2019-06-22 08:36:12

标签: java rest exception jackson embedded-jetty

我有码头服务器,它执行一些逻辑,完成后,它会创建一个json字符串(使用杰克逊)并将其作为响应发送。如果在创建json期间存在异常,则抛出JsonProcessingException。此异常冒泡到UncaughtErrorHandler(在Jetty中扩展了ErrorHandler),该日志记录该异常并返回一些失败消息和状态码500。

这仅用于后端api。

端点不是幂等的(它是后端点),当命中端点并应用逻辑时,应用程序(即数据库)的状态会发生变化。

现在,如果发生JsonProcessingException,则用户将收到失败消息,并且将不知道进程/逻辑已完成。

我该如何处理?

这是我对可能的解决方案的想法:

  • 保留现有行为,如果用户抱怨,则技术支持可以澄清该过程已完成。否则错误将通知支持人员,他们将检查日志并联系用户以说日志已通过。
    • 将端点保留为幂等(或类似,即应用程序状态不变),以便用户可以发送相同的请求(具有相同的主体)并获得响应(工作时即没有JsonProcessingException),该响应声明它已经完成了,或者不能像已经完成那样去做。
  • 在创建json字符串时捕获JsonProcessingException,用异常消息记录它,并创建一个不带json的响应,通知用户该过程已完成。尽管这意味着用户将需要处理两个不同的响应,但是在上述(当前)解决方案中减少了人与人之间的互动。
    • 或在运行时异常(或其他异常)中对其进行转换/包装,并将其放入catch块中。但是分配更好的异常消息(即过程已完成)。然后,在errorHandler中,当发现特定异常时,我可以在响应主体中显示此异常消息。这样,用户将知道该过程已完成,并且不会发送其他请求。但是如上所述,用户将不得不处理不同类型的响应。
  • 请勿使用Jackson来创建json字符串,请使用String.format()和json模板手动进行操作。对于简单的json来说这很好,但是复杂的json将是一场噩梦。
  • 具有一些逻辑,该逻辑检查上一个呼叫是否已完成但未在响应中确认,然后使用正确的详细信息(通过某些客户端,例如,电子邮件/短信)对用户进行呼叫。似乎需要很多工作。

您还有其他建议吗?

下面是一些示例代码来显示发生这种情况的地方:

private String createFailedResponseBodyJson(FailedPlaneLandStatus failedPlaneLandStatus) throws JsonProcessingException {
    LinkedHashMap<String, String> jsonBody = new LinkedHashMap<>();
    jsonBody.put("PlaneId", failedPlaneLandStatus.planeId.value);
    jsonBody.put("PlaneStatus", failedPlaneLandStatus.planeStatus.name());
    jsonBody.put("AirportStatus", failedPlaneLandStatus.airportStatus.name());
    jsonBody.put("LandFailureReason", failedPlaneLandStatus.failureMessage.toString());

    return new ObjectMapper().setDefaultPrettyPrinter(new DefaultPrettyPrinter())
            .writerWithDefaultPrettyPrinter().writeValueAsString(jsonBody);
}

是writeValueAsString()方法引发JsonProcessingException

我认为我对现有的行为感到满意(第一个要点)。但是我只想知道其他解决方案(其他要点)是否可行,或者是否还有其他解决方案?

谢谢

0 个答案:

没有答案