【问题标题】:Spring Boot MVC - How to generate etag value of an entity programatically?Spring Boot MVC - 如何以编程方式生成实体的 etag 值?
【发布时间】: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 值?

【问题讨论】:

    标签: spring-boot etag


    【解决方案1】:

    ShallowEtagHeaderFilter 根据序列化的响应正文计算 ETag 值,因此不太可能预先计算(即在实际发送响应正文之前)。

    如果我对您的理解正确,您希望采用乐观锁定机制。如果是这种情况,我建议放弃ShallowEtagHeaderFilter,而是首先手动计算 ETag,如下所示:

    String etag = calculateETag(); // TODO
    return ResponseEntity.ok()
          .eTag(etag)
          .body(resourceAssembler.toResource(assignment));
    

    如果使用 JPA,您可以在此处重新使用 @Version 字段作为 ETag 值。

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2015-05-18
      • 2015-04-07
      • 1970-01-01
      相关资源
      最近更新 更多