spring-boot - 将自定义 header 添加到 REST PUT 请求

标签 spring-boot spring-data-rest

我有一个使用 Spring Boot 2.1.8 和 Angular 前端的应用程序。我已经使用@RepositoryRestResource 定义了我的存储库。 Spring Boot 应用基本上为 Angular 部分提供了一个 REST API。该应用程序定义了多个业务实体,REST respo 为每个实体提供了 CRUD 功能。这是其中一个实体的典型 repo 接口(interface):

// REST resouce /api/privgroups
@RepositoryRestResource(collectionResourceRel = "privgroups", path = "privgroups")
public interface PrivGroupRepository extends CrudRepository<PrivGroup, Long>
{
   List<PrivGroup> findAll();
}

GETing 和单个实体、POSTing(创建实体)和 PUTing(更新实体)都工作正常,但我想在更新 (HTTP PUT) 实体时返回自定义 header 。 header 将由 Angular 端使用,以显示特定于该实体的自定义 toastr 消息。由于存储库还实现了 REST 接口(interface),我不确定如何添加会根据目标实体更改的特定 header 。

我开发的应用程序包含一个 REST Controller ,该 Controller 调用一个服务,而该服务又调用一个存储库。在这种情况下,我有更多的控制权并且可以像这样轻松地返回自定义 header :

@PutMapping("/{id}")
public ResponseEntity<MyEntity> updateMyEntity(@PathVariable("id") Long id, @RequestBody MyEntity myEntity)
{
    MyEntity updatedEntity = this.MyEntityService.updateMyEntity(MyEntity);
    return ResponseEntity.ok()
        .header("X-Save", "MyEntity")
        .body(updatedEntity);
}

我可以使用更新的“内置”技术来实现这一目标吗?我知道我可以使用过滤器添加 header ,并且我已经阅读了几篇有关该主题的文章。我认为很难确定正在更新的实体,而且我不确定这是最好的方法。

请注意这篇文章: Rest API - how add custom headers? 真的很老。 spring 数据 rest 文档 https://docs.spring.io/spring-data/rest/docs/current/reference/html/ 没有关于该主题的任何具体信息。

最佳答案

我最近使用了 Spring Data Rest,但我没有找到任何“内置”技术。但是,您可以通过在用 @ControllerAdvice 注释的类中实现 ResponseBodyAdvice 接口(interface)来实现这一点。这是我得到它的方式:

@ControllerAdvice
public class PutMyEntityBodyAdvice implements ResponseBodyAdvice<Object> {

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

        // Write the condition to check if beforyBodyWrite should be called
        return returnType.getParameterType().equals(ResponseEntity.class);
    }

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

        // Check if it is a PUT request for MyEntity object
        if (HttpMethod.PUT.equals(request.getMethod()) && object instanceof PersistentEntityResource) {
            PersistentEntityResource persistentEntityResource = (PersistentEntityResource) object;
            if (persistentEntityResource.getContent().getClass().equals(MyEntity.class)) {
                // Add custom header or manipulate response object
                response.getHeaders().add("X-Save", "MyEntity");
            }
        }
        return object;
    }
}

关于spring-boot - 将自定义 header 添加到 REST PUT 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58848932/

相关文章:

java - 数据库更新后运行的 PUT 和 PATCH 的 Spring 数据剩余验证

aws-api-gateway - 如何覆盖 X-Forwarded-Proto 和 X-Forwarded-Port 以便正确计算 Rels?

java - 我需要处理 executorservice 中的异常吗

java - 在 Spring Boot 中 FindByIndexNameSessionRepository 不能为空

java - Spring Boot Data REST、HATEOAS 无法使用自定义 Controller

spring - 每次重新加载时 % 符号在 URL 中编码为 %25

javascript - 使用 javascript 和 spring boot 下载文件

java - spring boot 使用@PathVariable 报404错误

java - 在 Spring Boot 中记录请求负载