【问题标题】:JSON Custom response in all my REST API, I might not know what it is called?我所有 REST API 中的 JSON 自定义响应,我可能不知道它叫什么?
【发布时间】:2019-09-30 09:34:37
【问题描述】:

所以问题是这样的,对于我的所有REST API 端点,我的RESPONSE Body 中应该始终存在 3 个字段,例如:

{
 "status": "SUCCESS",
 "message": "A list of a recent post",
 "data" : [LIST OF POSTS]
}

{
"status" : "NOT_AUTHORIZED",
"message": "User does not have previledge to access this resource",
"errors": ["User does not have Admin access"]
}

所以你可以明白,我希望这个消息状态错误或数据字段出现在我的 REST API 的所有响应中。

【问题讨论】:

  • 您可以在 POJO 中使用类似 @JsonInclude(JsonInclude.Include.NON_NULL) 的内容。这样您的响应中只能包含非空值。
  • 但这不是我要问的。我想要一个适用于我所有 API 端点的响应模板。其中有“消息”、“状态”、“错误”(如果有)或“数据”(如果有)

标签: java spring-boot jersey-2.0


【解决方案1】:

这可以通过ResponseBodyAdvice来实现:

允许在执行 @ResponseBodyResponseEntity 控制器方法之后但在使用 HttpMessageConverter 写入正文之前自定义响应。

可以直接使用RequestMappingHandlerAdapterExceptionHandlerExceptionResolver 注册实现,或者更可能使用@ControllerAdvice 进行注释,在这种情况下它们将被两者自动检测到。

所以你可以有类似的东西:

@ControllerAdvice
public class MyResponseBodyAdvisor implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType,
                            Class<? extends HttpMessageConverter<?>> converterType) {

        return converterType.isAssignableFrom(MappingJackson2HttpMessageConverter.class);
    }

    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {

        MyResponseWrapper wrapper = new MyResponseWrapper();
        wrapper.setData(body);
        return wrapper;
    }
}

MyResponseWrapper 是用于包装响应负载的类。

【讨论】:

    【解决方案2】:

    您可以在您的项目中添加一个过滤器,并在发送响应之前将这些添加到响应中。

    关注https://stackoverflow.com/a/41825563/4597596创建过滤器。

    【讨论】:

    • 是的,我已经看过那篇文章,但是还有另一个问题,例如异常和错误是运行时和每个 URL 端点的消息是不同的,那么我如何将这些值传递给过滤器?有什么好的文档吗?
    • 我认为您可以将错误消息和成功消息的模板维护为模型。在上面的过滤器代码中,检查响应状态代码并根据您的要求相应地附加正确的模板。
    【解决方案3】:

    您可以使用ResponseBodyAdvice&lt;T&gt; 在将响应 POJO 编组为 JSON 之前对其进行全局拦截,但这似乎不合适,因为您的每个 REST 方法都应该根据方法的功能生成不同的消息。此外,这无论如何都会迫使您使用一些包装类进行响应。

    所以,我想,最好在每个方法中手动将数据(连同状态和消息)包装到响应中

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多