【问题标题】:How to render ResponseEntity<>(HttpStatus.NOT_FOUND) differently?如何以不同的方式呈现 ResponseEntity<>(HttpStatus.NOT_FOUND)?
【发布时间】:2021-03-31 18:54:49
【问题描述】:

我的应用程序有一个 REST 接口,我必须自定义结果主体的呈现,以防控制器使用以下方法返回 ResponseEntity&lt;&gt;(NOT_FOUND) 作为控制器:

@Override
public ResponseEntity<ScimCoreUser> getUserById(String userid) {
    Optional<ScimCoreUser> result = service.findUserByNumber(userid);

    return result.map(user -> new ResponseEntity<>(user, HttpStatus.OK))
                 .orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
}

我无法更改方法的签名,因为我必须实现生成的接口。我知道我可以简单地抛出一个自定义异常并使用控制器建议处理这个异常。

有人知道如何接管ResponseEntity&lt;&gt;(HttpStatus.NOT_FOUND)) 的结果正文的呈现,以便我可以按照RFC 7644: System for Cross-domain Identity Management: Protocol 中定义的以下格式返回错误消息:

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
    "detail":"Resource 2819c223-7f76-453a-919d-413861904646 not found",
    "status": "404"
}

【问题讨论】:

    标签: spring-boot spring-mvc


    【解决方案1】:

    SCIM 协议和 Spring

    没有 SCIM 经验,但发现了一个相关问题: SCIM implementation for Spring Boot SAML and OKTA

    Spring 响应魔法:扩展点

    对于“渲染”,或响应实体转换为 HTTP 响应,Spring 使用 HttpMessageConverter 的子类。这个 bean 将是在你的 web-config 中定义和注入的候选对象。

    Spring 允许丰富/扩展 error-attributes 转换并作为错误响应发送: Spring Boot customize http error response?

    error-messages 用于丰富 HTTP 错误响应正文,例如 NOT_FOUND (404),要么由消息包(支持 I18N 的属性文件)定义,要么在响应过滤器链中设置.

    实际的渲染,如果是 JSON、纯文本、HTML 等,是由 Spring 在 content-negotiation 和请求 HTTP-client 时完成的。 但是,您可以覆盖控制器中的方法并指定参数 consumesproduces@RequestMapping 注释。

    【讨论】:

    • 我单步执行代码,Spring 仅调用消息转换器,如果是正文,即有效负载,如果不为空。在我的情况下,消息为空,因此没有调用消息转换器。
    • @Oliver 抱歉,我没有进一步研究。那么,您可以添加一个主体来触发 converter 吗?否则 Spring 肯定也会执行一些状态码序列化!?
    【解决方案2】:

    你可以使用

    return result.map(user -> new ResponseEntity<>(user, HttpStatus.OK))
                     .orElseThrow(() -> 
                          new ResponseStatusException(
                                HttpStatus.NOT_FOUND, "User not found");
    

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 2015-09-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多