将自定义标头添加到REST PUT请求中

问题描述 投票:1回答:1

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

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

GET和单个实体,POST(创建实体)和PUTing(更新实体)都工作正常,但是我想在更新(HTTP PUT)实体时返回自定义标头。标头将由Angular端使用,以显示特定于该实体的自定义烤面包机消息。由于存储库还实现了REST接口,因此我不确定如何添加将根据目标实体而变化的特定标头。

我已经开发了包括REST控制器的应用程序,该REST控制器调用服务,而服务又调用存储库。在这种情况下,我拥有更多控制权,可以轻松返回自定义标头,如下所示:

@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);
}

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

注意,此帖子:Rest API - how add custom headers?真的很老Spring Data Rest文档https://docs.spring.io/spring-data/rest/docs/current/reference/html/没有关于该主题的任何特定内容。

spring-boot spring-data-rest
1个回答
0
投票

我最近使用过Spring Data Rest,但没有找到任何“内置”技术。但是,您可以通过在以@@ ControllerAdvice注释的类中实现ResponseBodyAdvice接口来实现此目的。这是我的方法:

@ControllerAdvice
public class PutMyEntityBodyAdvice implements ResponseBodyAdvice<Object> {

    private final static String SPRING_DATA_REST_PUT_METHOD_NAME = "putItemResource";

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

        // Write the condition to check if beforyBodyWrite should be called
        if (returnType.getMethod() == null) {
            return false;
        }
        return SPRING_DATA_REST_PUT_METHOD_NAME.equals(returnType.getMethod().getName());
    }

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

        // Check if object is PersistentEntityResource containing MyEntity
        if (object instanceof PersistentEntityResource) {
            PersistentEntityResource persistentEntityResource = (PersistentEntityResource) object;
            if (persistentEntityResource.getContent().getClass().equals(MyEntity.class)) {
                // Modify header
                response.getHeaders().add("X-Save", "MyEntity");
            }
        }
        return object;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.