Spring Boot MVC -如何以编程方式生成实体的etag值?



我正在使用Spring Boot 1.5.18与ReactJs,我正在尝试使用eTag有条件地更新实体。

我已经添加了以下配置,Spring Boot正在响应头中生成标签。

@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值?

ShallowEtagHeaderFilter根据序列化的响应体计算ETag值,因此不容易预先计算它(即在实际发送响应体之前)。

如果我理解正确的话,你想要使用乐观锁定机制。如果是这种情况,我建议放弃ShallowEtagHeaderFilter,而是首先手动计算ETag,如下所示:

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

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

最新更新