【问题标题】:Augmenting Spring Rest API with common 'header'使用通用“标头”增强 Spring Rest API
【发布时间】:2015-12-01 15:57:07
【问题描述】:

我有许多 Spring REST 端点,它们都是返回具有以下结构的 JSON 所必需的:

"code": 0,
"status": "SUCCESS",
"debug": {
    ...
},
"someData": {
    ...
}

状态、代码和调试部分是每个响应的通用“header”,但“someData”特定于每个端点,有一个每个响应都有不同的名称,并且在某些情况下由响应中相同级别的多个元素组成。

特别是成功响应的状态和代码总是相同的。 (请注意,还有一个全局 @ControllerAdvice 用于处理返回状态/代码/消息错误响应的自定义和未捕获的异常)。

显然,我们可以简单地为每个控制器创建新的 POJO,这些控制器(例如)扩展一些包含通用内容的基类,并添加让 Spring/Jackson 完成其余工作的细节(没有双关语)。

但我希望有一些巧妙的方法可以用通用代码/状态/调试位“装饰”特定响应。 AOP 似乎太过分了,自定义 Jackson 转换器也是如此。

请注意,我们无法更改要求(例如,使用“正确”的 HTTP 响应代码、标头等),因为它是现有的实时 API。

【问题讨论】:

    标签: java json spring rest jackson


    【解决方案1】:

    我建议为您期望的每种响应类型设置一个单独的类。如果它们都包含代码/状态/调试,则有一个基类并设置每个响应类型以扩展该基类。

    此外,REST 设置为不仅包含响应正文,还包含响应标头和响应状态代码 (Link to glossary on w3.org),其中一些是标准的。其他自定义代码也有足够的空间。为什么不设置代码而不是在响应正文中包含代码和状态?

    【讨论】:

    • 完全同意您的建议,但不幸的是,API“合同”超出了我们的控制范围。应该在问题中明确说明,但无论如何谢谢。
    • 公平地说,我以前曾担任过那个职位。尽管如此,我还是推荐“POJO”选项。对我来说,这是处理它的最简单方法,尤其是当有人稍后进来维护包时。
    【解决方案2】:

    我也同意 jack 的回答,认为这是执行此操作的“正确方法”,但是鉴于您的要求,您可以考虑使用 Spring 的拦截器处理程序:
    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

    您可以编写一个小的处理程序来覆盖 postHandle() 方法,然后您就可以访问 HttpServletResponse 对象。 (并且可以 - 理论上 - 用那些自定义的标头信息来装饰它)我过去曾这样做以拦截请求,但从未响应,所以我在这里采取了一些措施。 (我会将此作为评论而不是“答案”发布,但我还没有足够的代表点)

    我不确定这是否比使用 AOP 更糟糕/更少过度杀伤力。 :)

    【讨论】:

      猜你喜欢
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 2017-08-29
      • 1970-01-01
      相关资源
      最近更新 更多