英文:
Exception Handling in Springboot with openapi: "3.0.2"
问题
# yml文件
/namespace/{namespace}/bucket/{bucketName}/file/{fileName}:
get:
operationId: downloadFileFromEcs
summary: 从ECS下载文件
description: 从ECS下载文件
security:
- x-et-auth-details: []
tags:
- ECS
parameters:
- in: path
name: bucketName
schema:
type: string
required: true
- in: path
name: namespace
schema:
type: string
required: true
- in: path
name: fileName
schema:
type: string
required: true
responses:
200:
description: 下载文件成功
content:
application/octet-stream:
schema:
$ref: "#/components/schemas/DownloadFile"
400:
content:
application/json:
schema:
$ref: "#/components/schemas/Error400BadRequest"
403:
content:
application/json:
schema:
$ref: "#/components/schemas/Error403AccessDenied"
404:
content:
application/json:
schema:
$ref: "#/components/schemas/Error404NotFound"
500:
content:
application/json:
schema:
$ref: "#/components/schemas/Error500InternalServerError"
default:
description: 非预期错误
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
// Rest-api.java
@ApiOperation(
value = "从ECS下载文件",
nickname = "downloadFileFromEcs",
notes = "从ECS下载文件",
response = org.springframework.core.io.Resource.class,
tags = { "ECS" })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "下载文件成功", response = org.springframework.core.io.Resource.class),
@ApiResponse(code = 400, message = "", response = Error400BadRequest.class),
@ApiResponse(code = 403, message = "", response = Error403AccessDenied.class),
@ApiResponse(code = 404, message = "", response = Error404NotFound.class),
@ApiResponse(code = 500, message = "", response = Error500InternalServerError.class),
@ApiResponse(code = 200, message = "非预期错误", response = ErrorResponse.class)
})
@RequestMapping(
value = "/namespace/{namespace}/bucket/{bucketName}/file/{fileName}",
produces = { "application/octet-stream", "application/json" },
method = RequestMethod.GET)
default CompletableFuture<ResponseEntity<org.springframework.core.io.Resource>> _downloadFileFromEcs(
@ApiParam(value = "", required = true) @PathVariable("bucketName") String bucketName,
@ApiParam(value = "", required = true) @PathVariable("namespace") String namespace,
@ApiParam(value = "", required = true) @PathVariable("fileName") String fileName
) {
return downloadFileFromEcs(bucketName, namespace, fileName);
}
// Rest-impl.java
@Override
public CompletableFuture<ResponseEntity<Resource>> downloadFileFromEcs(String bucketName, String namespace, String fileName) {
// 将文件加载为资源
logger.info("[ECS Controller] 下载:开始输入流");
InputStream inputStream = ecsService.downloadFileFromS3Bucket(bucketName, namespace, fileName);
logger.info("[ECS Controller] 下载:开始资源");
Resource resource = new InputStreamResource(inputStream);
logger.info("[ECS Controller] 设置文件下载响应");
String contentType = "application/octet-stream";
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.parseMediaType(contentType));
logger.info("[ECS Controller] 设置HTTP头");
return CompletableFuture.completedFuture(new ResponseEntity<Resource>(
resource, httpHeaders, HttpStatus.OK));
}
// ServiceIMPL.java
public InputStream downloadFileFromS3Bucket(String bucket, String namespace, String fileName) throws AmazonS3Exception {
if (!namespace.isEmpty() && namespace.equals("ac_gemsync")) {
accessKey = accessKeyGem;
secretKey = secretKeyGem;
}
if (!bucket.isEmpty()) {
bucketName = bucket;
}
String result = "";
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonS3Client s3client = new AmazonS3Client(credentials);
s3client.setEndpoint(endpointUrl);
S3ClientOptions options = new S3ClientOptions();
options.setPathStyleAccess(true);
s3client.setS3ClientOptions(options);
logger.info("[ECS Download] 下载:开始S3下载");
long startTime = System.currentTimeMillis();
S3Object object = s3client.getObject(new GetObjectRequest(bucketName, fileName));
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
logger.info("[ECS CALL] downloadFileFromS3Bucket: :" + totalTime + " 毫秒");
logger.info("[ECS Download] 下载:开始输入流");
InputStream inputStream = object.getObjectContent();
logger.info("[ECS Download] 完成输入流");
return inputStream;
}
英文:
I am trying to handle exceptions within my downloadfile Api. I am using openapi: "3.0.2" in springboot service. I tried implementing controlleradvice but OPEN API is not supporting Controlleradvice. Could you please suggest a standard approach or soulution which helps me in handling exceptions.
Please find my delete file code below.
yml file
/namespace/{namespace}/bucket/{bucketName}/file/{fileName}:
get:
operationId: downloadFileFromEcs
summary: Download file from ECS
description: |-
Download file from ECS
security:
- x-et-auth-details: []
tags:
- ECS
parameters:
- in: path
name: bucketName
schema:
type: string
required: true
- in: path
name: namespace
schema:
type: string
required: true
- in: path
name: fileName
schema:
type: string
required: true
responses:
200:
description: Downloaded file
content:
application/octet-stream:
schema:
$ref: "#/components/schemas/DownloadFile"
400:
content:
application/json:
schema:
$ref: "#/components/schemas/Error400BadRequest"
403:
content:
application/json:
schema:
$ref: "#/components/schemas/Error403AccessDenied"
404:
content:
application/json:
schema:
$ref: "#/components/schemas/Error404NotFound"
500:
content:
application/json:
schema:
$ref: "#/components/schemas/Error500InternalServerError"
default:
description: unexpected error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
Rest-api.java
@ApiOperation(value = "Download file from ECS", nickname = "downloadFileFromEcs", notes = "Download file from ECS", response = org.springframework.core.io.Resource.class, tags={ "ECS", })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Downloaded file", response = org.springframework.core.io.Resource.class),
@ApiResponse(code = 400, message = "", response = Error400BadRequest.class),
@ApiResponse(code = 403, message = "", response = Error403AccessDenied.class),
@ApiResponse(code = 404, message = "", response = Error404NotFound.class),
@ApiResponse(code = 500, message = "", response = Error500InternalServerError.class),
@ApiResponse(code = 200, message = "unexpected error", response = ErrorResponse.class) })
@RequestMapping(value = "/namespace/{namespace}/bucket/{bucketName}/file/{fileName}",
produces = { "application/octet-stream", "application/json" },
method = RequestMethod.GET)
default CompletableFuture<ResponseEntity<org.springframework.core.io.Resource>> _downloadFileFromEcs(@ApiParam(value = "",required=true) @PathVariable("bucketName") String bucketName
,@ApiParam(value = "",required=true) @PathVariable("namespace") String namespace
,@ApiParam(value = "",required=true) @PathVariable("fileName") String fileName
) {
return downloadFileFromEcs(bucketName, namespace, fileName);
}
// Override this method
default CompletableFuture<ResponseEntity<org.springframework.core.io.Resource>> downloadFileFromEcs(String bucketName,String namespace,String fileName) {
if(getObjectMapper().isPresent() && getAcceptHeader().isPresent()) {
if (getAcceptHeader().get().contains("application/json")) {
try {
return CompletableFuture.completedFuture(new ResponseEntity<>(getObjectMapper().get().readValue("\"\"", org.springframework.core.io.Resource.class), HttpStatus.NOT_IMPLEMENTED));
} catch (IOException e) {
log.error("Couldn't serialize response for content type application/json", e);
return CompletableFuture.completedFuture(new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
}
}
} else {
log.warn("ObjectMapper or HttpServletRequest not configured in default EcsApi interface so no example is generated");
}
return CompletableFuture.completedFuture(new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED));
}
Rest-impl.java
@Override
public CompletableFuture<ResponseEntity<Resource>> downloadFileFromEcs(String bucketName,String namespace, String fileName) {
// Load file as Resource
logger.info("[ECS Controller] Download: Starting input stream");
InputStream inputStream = ecsService.downloadFileFromS3Bucket(bucketName, namespace, fileName);
logger.info("[ECS Controller] Download: Starting resource ");
Resource resource = new InputStreamResource(inputStream);
logger.info("[ECS Controller] setting fileDownloadResponse");
String contentType = "application/octet-stream";
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.parseMediaType(contentType));
logger.info("[ECS Controller] setting http headers");
/* return CompletableFuture.completedFuture(ResponseEntity<ECSDownloadResponse>.ok()
.contentType(MediaType.parseMediaType(contentType))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
.body(resource));*/
return CompletableFuture.completedFuture(new ResponseEntity<Resource>(
resource,httpHeaders, HttpStatus.OK));
}
ServiceIMPL.java
public InputStream downloadFileFromS3Bucket(String bucket, String namespace, String fileName) throws AmazonS3Exception {
if (!namespace.isEmpty() && namespace.equals("ac_gemsync")) {
accessKey = accessKeyGem;
secretKey = secretKeyGem;
}
if (!bucket.isEmpty()) {
bucketName = bucket;
}
String result = "";
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonS3Client s3client = new AmazonS3Client(credentials);
s3client.setEndpoint(endpointUrl);
S3ClientOptions options = new S3ClientOptions();
options.setPathStyleAccess(true);
s3client.setS3ClientOptions(options);
logger.info("[ECS Download] Download: Starting s3 download");
long startTime = System.currentTimeMillis();
S3Object object = s3client.getObject(new GetObjectRequest(bucketName, fileName));
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
logger.info("[ECS CALL] downloadFileFromS3Bucket: :" + totalTime + " milli secs");
logger.info("[ECS Download] Download: Starting input stream");
InputStream inputStream = object.getObjectContent();
logger.info("[ECS Download] Done input stream");
return inputStream;
}
专注分享java语言的经验与见解,让所有开发者获益!
评论