我有一个使用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();
}
获取和单个实体,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/ 没有关于该主题的任何具体信息。
答案 0 :(得分:2)
我最近使用过Spring Data Rest,但没有找到任何“内置”技术。但是,您可以通过在以 @ControllerAdvice 注释的类中实现 ResponseBodyAdvice 接口来实现此目的。这是我的方法:
print([v - 10 if i in x else v for i,v in enumerate(v)])
答案 1 :(得分:0)
@pepevalbe的回答似乎很有希望。
另一种选择是-如您所建议-使用标准的Servlet过滤器或Spring HandlerInterceptor。
要解决在那种情况下获取对已修改实体的引用的问题,您可以注册一个Spring Data Rest事件侦听器,该事件侦听器将简单地将对已修改实体的引用存储在ThreadLocal存储中,可以从该位置在Filter或HandlerInterceptor。
https://www.baeldung.com/java-threadlocal
https://docs.spring.io/spring-data/rest/docs/current/reference/html/#events.application-listener