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)

以编程方式登录用户 SPring MVC

如何以编程方式使用 Spring Boot 和 Tomcat 提供密钥库文件?

Spring Boot 以编程方式设置配置文件