2011-12-28 74 views
0

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

现在,如果没有挂起的消息,我返回null。但问题是,如何通知客户端如果我有一个错误,例如,数据库连接已经丢失,身份验证是错误的,还是我愿意与客户端分享的任何其他异常?

回答

0

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

0

你可以纯粹抛出异常来做到这一点。 SpringMVC将异常映射到标准http状态代码(200s,400s,500s等)。就像您在Java中编写代码时一样,您可以创建自定义例外以适应您的特定需求。

0

如果你正在设计客户端和服务器,那么你可能想要定义某种协议,这可能很有趣。您可以将您的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" 
} 

你会非常有尝试捕获块捕获任何预期的异常,然后可以将其转换为适当的JSON响应,概述客户端可以处理的问题。

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

+0

你已经有了一个很好的标题,但我的服务器接受从数据库中检索到的对象,并自动将它们转换为JSON格式(jersey + jackson),所以我不能真正做你所提供的... – stdcall 2011-12-28 19:42:15

+0

你应该只需将它包装到自定义的json响应中,其中“data”属性是从数据库返回的json数据......它确实不应该是一个问题,特别是因为有太多的json序列化API用于java – 2011-12-28 19:55:55

+0

我通常使用org.json,但从杰克逊JSON处理器库的初步浏览,它真正显示允许这样简单的事情 – 2011-12-28 19:59:23

0

从HTTP响应状态码开始。例如,如果您有数据库连接问题,则返回500内部服务器错误。

此方法可能无法为您的客户提供他们所需的全部信息。因此,另外,您可以在响应正文中提供JSON的详细信息。不管你想要结构这个JSON。如果您希望客户端应用在收到您的回复后转到特定网址,请考虑在回复中提供该网址。

最后一点:将200 OK与响应正文中的错误结合起来将会是一种糟糕的形式。我以前见过这个,而且很烦人。