我正在使用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值。