我正在使用必须上传大文件的控制器,问题是当返回时
CompletableFuture<ResponseEntity<ExecutionDto>>
它总是返回错误403,但是当我更改返回类型时,它成功返回DTO,但它被阻塞。身份验证工作正常。可能是什么问题?
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CompletableFuture<ResponseEntity<ExecutionDto>> handleFileUpload(
@RequestPart("file1") MultipartFile file1,
@RequestPart(value = "file2", required = false) MultipartFile file2) throws ExecutionException, InterruptedException {
List<MultipartFile> files = new ArrayList<>();
files.add(file1);
if (file2 != null && !file2.isEmpty()) {
files.add(file2);
}
User user = userRepository.findByEmailWithAgency(userService.getAuthenticatedUser().getEmail()).get();
String uploadId = "upload_" + System.currentTimeMillis();
System.out.println("Upload ID : " + uploadId);
progressTracker.initializeProgress(uploadId);
return executionService.handleFileUpload(files, uploadId, user)
.thenApply(ResponseEntity::ok);
}
我尝试在服务上添加安全上下文,但仍然没有任何结果。
要解决此问题,您需要确保安全上下文传播到执行
CompletableFuture
的线程。有几种方法可以做到这一点:
@Async
与安全上下文传播一起使用。
如果您的应用程序使用 Spring 的 @Async
进行异步处理,则可以将 @Async
注解与 SecurityContextHolder
策略配置结合使用。CompletableFuture
中手动传播安全上下文。
或者,您可以在使用 CompletableFuture
时手动传播安全上下文。