【问题标题】:Notifying client about an exception通知客户异常
【发布时间】:2011-12-28 19:09:01
【问题描述】:

我有一个基于 Spring MVC 的应用程序服务器,它通过 JSON 与客户端通信。 客户端可以执行的查询之一是“我有未处理的消息吗?” 为此,客户端创建一个身份验证对象并将其发布到服务器。作为回报,服务器发回待处理消息列表for ex. List<PendingMessage>

现在,如果没有待处理的消息,我将返回 null。但问题是,如果出现错误,例如数据库连接丢失、身份验证错误或我愿意与客户端共享的任何其他异常,如何通知客户端?

【问题讨论】:

    标签: java json spring-mvc client-server


    【解决方案1】:

    您可以捕获代码可能抛出的不同类型的异常。基于此,您可以定义自己的自定义消息并将其发送给客户端。在客户端,您只需对异常执行 getMessage()。这应该可以解决问题。

    【讨论】:

      【解决方案2】:

      您完全可以通过抛出异常来做到这一点。 SpringMVC 将异常映射到标准 http 状态码(200s、400s、500s 等)。就像您在 Java 中编码时一样,您可以创建自定义异常以满足您的特定需求。

      【讨论】:

        【解决方案3】:

        如果您同时设计客户端和服务器,那么您可能想要定义某种协议,这会很有趣。您可以将 Web 服务器视为 rpc 服务器,它为给定的请求以定义的格式返回数据。

        例如,使用 HTTP 状态码,成功的响应可能会返回以下数据:

        {
            status: 200,
            message: "OK",
            data: {
                name: John Doe,
                age: 31
            },
            error: null
        }
        

        导致错误的请求:

        {
            status: 400,
            message: "Bad Request",
            data: null,
            error: "Database request timed out"
        }
        

        您几乎有一个 try catch 块来捕获任何预期的异常,然后可以将其转换为适当的 JSON 响应,概述问题,然后由客户端处理。

        如果请求在到达 servlet 之前只是有错误,则用于发出请求的 API 可能会公开某种 onError 回调,然后可以使用该回调将错误通知客户端。

        【讨论】:

        • 你有一个不错的标题,但我的服务器从数据库中获取对象并自动将它们转换为 JSON 格式(jersey+jackson),所以我不能真正做你提供的东西。 ..
        • 您应该能够将其包装到您的自定义 json 响应中,其中“data”属性是从数据库返回的 json 数据......它真的不应该是一个问题,特别是因为java的json序列化API实在是太多了
        • 我通常使用 org.json,但是从 Jackson JSON 处理器库的第一眼看,它确实表明允许像这样简单的东西
        【解决方案4】:

        从 HTTP 响应状态码开始。例如,如果您有 DB 连接问题,则返回 500 Internal Server Error。

        这种方法可能无法为您的客户提供他们需要的所有信息。因此,此外,您可以在响应正文中以 JSON 格式提供详细信息。随心所欲地构造这个 JSON。如果您希望客户端应用在收到您的响应后转到特定 URL,请考虑在响应中提供该 URL。

        最后一点:将 200 OK 与响应正文中的错误结合起来是一种不好的形式。我以前见过这样做,这很烦人。

        【讨论】:

          猜你喜欢
          • 2011-05-27
          • 1970-01-01
          • 2012-04-22
          • 1970-01-01
          • 2013-05-03
          • 1970-01-01
          • 2018-10-25
          • 1970-01-01
          • 2013-05-20
          相关资源
          最近更新 更多