Swagger如何正确生成自定义异常类?

问题描述 投票:0回答:3

我需要使用 swagger 生成异常类,但我无法正确生成它们,因为我的自定义异常类扩展了 Exception,而 Exception 扩展了 Throwable。

因此,当我举例说响应是 oneOf = {Ex1Error.class, Ex2Error.class} 这些类扩展了 Exception,因此这些类将生成缺失的东西...有没有办法做到这一点? 谢谢

java exception swagger
3个回答
1
投票

Swagger 本身尚不处理应用程序异常。您需要创建一个

ExceptionMapper
。检查这个https://www.codepedia.org/ama/error-handling-in-rest-api-with-jersey/。 这个解决方案更优雅https://www.baeldung.com/global-error-handler-in-a-spring-rest-api。因此,无论哪种方式,您都需要创建自己的
class Mapper


0
投票

好吧,对于那些有同样“问题”的人来说,目前还没有办法做到这一点。

正如您在这里看到的:https://github.com/swagger-api/swagger-core/issues/730

wenyi189的评论和我描述的问题一模一样。 “现在已经是 2019 年了。这仍然不受支持。我遇到了确切的问题,我有多个 APIException 子类型。这个 APIException 是从 java 的 RuntimeException 扩展的。例如,如果我有一个名为 UnexpectedException 的子类型并且它扩展了 APIException,父类中的所有内容都被拾取,包括 Throwable.class 中的字段,非常烦人,但仍然找不到让它工作的方法。”

所以是的。目前还没有办法做到这一点!


0
投票

最新的 OpenAPI Generator for Maven(Spring 生成器) 提供了

unhandledException
属性。根据文档:

声明操作方法来抛出通用异常并允许未处理的异常(对于 Spring

@ControllerAdvice
指令很有用)。

这会使用

throws Exception
生成控制器的委托或接口。这允许根据需要实现具有特定异常的操作(参见下文,我正在使用 JHipster 的教程中的所有代码):
@Override

然后代表:

<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>${openapi-generator-maven-plugin.version}</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <inputSpec>${project.basedir}/src/main/resources/swagger/api.yml</inputSpec> <generatorName>spring</generatorName> <apiPackage>com.anothercaffeinatedday.books.web.api</apiPackage> <modelPackage>com.anothercaffeinatedday.books.service.dto</modelPackage> <modelNameSuffix>DTO</modelNameSuffix> <supportingFilesToGenerate>ApiUtil.java</supportingFilesToGenerate> <typeMappings> <typeMapping>set=Set</typeMapping> </typeMappings> <importMappings> <importMapping>Set=java.util.Set</importMapping> </importMappings> <skipValidateSpec>false</skipValidateSpec> <configOptions> <delegatePattern>true</delegatePattern> <title>books</title> <useSpringBoot3>true</useSpringBoot3> <unhandledException>true</unhandledException> </configOptions> </configuration> </execution> </executions> </plugin>

然后执行:

/** * POST /books * * @param bookDTO a book (required) * @return the new book (status code 201) * or error occurred - see status code and problem object for more information. (status code 200) * @see BooksApi#createBook */ default ResponseEntity<BookDTO> createBook(BookDTO bookDTO) throws Exception { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "null"; ApiUtil.setExampleResponse(request, "application/json", exampleString); break; } if (mediaType.isCompatibleWith(MediaType.valueOf("application/problem+json"))) { String exampleString = "Custom MIME type example not yet supported: application/problem+json"; ApiUtil.setExampleResponse(request, "application/problem+json", exampleString); break; } } }); return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

	
© www.soinside.com 2019 - 2024. All rights reserved.