spring-boot - 将自定义标头添加到 REST PUT 请求
问题描述
我有一个使用带有 Angular 前端的 Spring Boot 2.1.8 的应用程序。我已经使用@RepositoryRestResource 定义了我的存储库。Spring Boot 应用程序基本上为 Angular 提供了一个 REST API。该应用程序定义了几个业务实体,REST 响应为每个实体提供了 CRUD 功能。这是其中一个实体的典型 repo 接口:
// REST resouce /api/privgroups
@RepositoryRestResource(collectionResourceRel = "privgroups", path = "privgroups")
public interface PrivGroupRepository extends CrudRepository<PrivGroup, Long>
{
List<PrivGroup> findAll();
}
GETing 和单个实体,POSTing(创建实体)和 PUTing(更新实体)都可以正常工作,但我想在更新(HTTP PUT)实体时返回自定义标头。Angular 端将使用标头来显示特定于该实体的自定义 toastr 消息。由于存储库还实现了 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 - 如何添加自定义标头? 真的老了。春季数据休息文档https://docs.spring.io/spring-data/rest/docs/current/reference/html/ 没有关于该主题的任何具体内容。
解决方案
我最近使用了 Spring Data Rest,但没有找到任何“内置”技术。但是,您可以通过在使用@ControllerAdvice注释的类中实现ResponseBodyAdvice接口来实现这一点。这就是我得到它的方式:
@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;
}
}
推荐阅读
- vue.js - Vue3 安装时出现 _FSEventStreamCreate 错误
- python - 哪个 Selenium 方法或命令可用于单击以下按钮?
- postgresql - 无法从 AWS 外部连接到 RDS/Postgres 外部表
- django - 为什么调用 Django 的 create_user 辅助函数时会出现 IntegrityError?
- javascript - 选择 onchanged javascript
- javascript - 内部与外部构造函数的 JavaScript 类属性
- python - Pandas Python 拆分一行,用它来计算它出现的次数并替换结果
- python - 使用分类数据绘制曲面图
- javascript - 如何将 ngx-quill 编辑器内容从我的数据库呈现到视图组件?
- node.js - 通过 http-server 在 Node JS (express) 服务器中部署 Angular 应用程序