我需要使用 swagger 生成异常类,但我无法正确生成它们,因为我的自定义异常类扩展了 Exception,而 Exception 扩展了 Throwable。
因此,当我举例说响应是 oneOf = {Ex1Error.class, Ex2Error.class} 这些类扩展了 Exception,因此这些类将生成缺失的东西...有没有办法做到这一点? 谢谢
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
好吧,对于那些有同样“问题”的人来说,目前还没有办法做到这一点。
正如您在这里看到的:https://github.com/swagger-api/swagger-core/issues/730
wenyi189的评论和我描述的问题一模一样。 “现在已经是 2019 年了。这仍然不受支持。我遇到了确切的问题,我有多个 APIException 子类型。这个 APIException 是从 java 的 RuntimeException 扩展的。例如,如果我有一个名为 UnexpectedException 的子类型并且它扩展了 APIException,父类中的所有内容都被拾取,包括 Throwable.class 中的字段,非常烦人,但仍然找不到让它工作的方法。”
所以是的。目前还没有办法做到这一点!
最新的 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);