Spring Boot MVC - 如何以编程方式生成实体的 etag 值?
Posted
技术标签:
【中文标题】Spring Boot MVC - 如何以编程方式生成实体的 etag 值?【英文标题】:Spring Boot MVC - How to generate etag value of an entity programatically? 【发布时间】:2021-10-29 17:34:26 【问题描述】:我正在使用带有 ReactJs 的 Spring Boot 1.5.18,并且我正在尝试使用 eTag 有条件地更新实体。
我添加了以下配置,并且 Spring Boot 正在响应标头中生成 etag。
@Bean
public Filter shallowEtagHeaderFilter()
return new ShallowEtagHeaderFilter();
现在我想在更新实体之前检查我的控制器方法是否匹配。我的控制器方法如下:
@RequestMapping(method = POST, value = "/assignments/id/edit")
public @ResponseBody
ResponseEntity<?> editStaffAssignment(@RequestBody Resource<AssignmentDTO> dtoResource,
@PathVariable Long id,
PersistentEntityResourceAssembler resourceAssembler, Pageable pageable)
Assignment assignment = assignHandler.updateAssignment(dtoResource.getContent(), id);
return new ResponseEntity<>(resourceAssembler.toResource(assignment), HttpStatus.OK);
我已经在来自 reactjs 客户端的 Axios 请求中包含了 etag 标头,我可以在控制器方法中提取它,但是如何以编程方式在服务器端生成当前的 etag 值?
【问题讨论】:
【参考方案1】:ShallowEtagHeaderFilter
根据序列化的响应正文计算 ETag 值,因此不太可能预先计算(即在实际发送响应正文之前)。
如果我对您的理解正确,您希望采用乐观锁定机制。如果是这种情况,我建议放弃ShallowEtagHeaderFilter
,而是首先手动计算 ETag,如下所示:
String etag = calculateETag(); // TODO
return ResponseEntity.ok()
.eTag(etag)
.body(resourceAssembler.toResource(assignment));
如果使用 JPA,您可以在此处重新使用 @Version
字段作为 ETag 值。
【讨论】:
以上是关于Spring Boot MVC - 如何以编程方式生成实体的 etag 值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]
如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]
如何以编程方式将“@Cascade”添加到 POJO 字段(Spring mvc + Hibernate)