逗号分隔值的定义被启发式解析为 RestError 的属性。按位次顺序,定义可以包括:

  非明确定义的根据位次进行处理。也是说,以下定义是等价的:
  明确的(一行,换行是为了格式化):
  status=500, code=10023, msg=error.notFound,
  moreInfoUrl=http://foo.com/docs/api/10023
  不明确的:
  500, 10023, error.notFound, http://foo.com/docs/api/10023
  后面这个比较简洁而且更加方便。
  另外,支持两个特殊值:_exmsg 和 _msg:
  _exmsg 表明 message 属性应该反射为运行时异常消息,例如 exception.getMessage()
  _msg 只对 developerMessage 属性有效,它表明 developerMessage 的值和 message 的值一样。
  后,需要注意的是,由于这些定义都是简单的键/值对,如果你的项目有很多这样的定义,好将他们定义到一个 .properties 文件中,而不是在 Spring 的 XML 中。可以在启动时使用一些轻微的胶水代码或配置来读取那个文件,并作为 Map 放到 DefaultRestErrorResolver 中。
  应用异常映射示例
  在示例应用的 rest-servlet.xml 文件中,有两个示例异常映射定义
  <entry key="com.stormpath.blog.spring.mvc.rest.exhandler.UnknownResourceException" value="404, _exmsg"></entry>
  第一个可以概述为:“如果遇到 UnknownResourceException 则返回一个 HTTP 状态码为 404 的 RestError实例,其 message 属性默认为该异常的 message。”(_exmsg 表明应该使用 exception.getMessage() 作为 message 属性的值)。
  <entry key="Throwable" value="500, error.internal"></entry>
  第二个可以概述为:“如果遇到任何无法处理的 Throwable 则返回一个 HTTP 状态码为 500 的 RestError 实例, 以及一个 message 值,该值通过一个可用的 MessageSource 根据异常消息键 error.internal 获取返回”。(RestError的 message 值将会和调用 messageSource.getMessage(“error.internal”, null, “error.internal”, locale) 结果一样)。
  通过翻译消息码为制定语言的消息,DefaultRestErrorResolver 实现甚至支持国际化(i18n)。它实现了 MessageSourceAware 来自动在 Spring 应用中获取任何已注册的 MessageSource 实例。它还允许配置一个 LocaleResolver 在解析特定本地化消息时使用。这允许你根据 REST 请求的本地信息得到特定语言的异常消息。太棒了!
  总结
  此处呈现的新的 RestExceptionHandler 非常灵活,并且支持非常个性化的异常数据,根据佳实践的 REST 异常表示法,甚至可以返回国际化消息。
  本文的代码和示例应用许可为非常商业友好的 Apache 2 许可,与 Spring 框架的许可相同。因此,我们希望 Spring 的开发人员会将这些组件合入 Spring 的未来版本中,同时如果他们有兴趣的话,我们很乐意尽大努力协助他们。