![](/img/trans.png)
[英]How to pass Class of a type in swagger ApiOperation annotation response variable
[英]How to pass file content to swagger @ExampleProperty annotation value?
我正在使用swagger 3.0.0-Snapshot為我的Spring Boot應用程序創建文檔。 我的Maven依賴項是
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webmvc</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
我的大張旗鼓的配置類是盡可能簡單的:
@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.select()
.apis(RequestHandlerSelectors.basePackage("com.mycompany.cs"))
.paths(PathSelectors.any())
.build()
.pathMapping("/")
.useDefaultResponseMessages(false);
}
我的控制器方法具有以下注釋:
@ApiOperation(value = "Hello world", httpMethod = "POST")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK",
examples = @Example(value = @ExampleProperty(mediaType = "application/json",
value = exampleValue)))
})
它正在運行,並在Swagger UI中顯示了具有常量字符串exampleValue的字段“ Example Value”字段值,該字符串是私有靜態String。
問題是如何將資源文件夾中json文件的內容傳遞給@ExampleProperty值?
我試圖讀取靜態塊中的文件內容,並將其傳遞給它初始化最終的String,但是隨后編譯器說“屬性值必須恆定”。
json文件的內容必須在Swagger UI的示例字段中顯示。
好消息是Swagger正在使用Spring,並且可以使用DI的功能。
例如,您想向ServiceModelToSwagger2MapperImpl添加新功能。 創建自己的擴展組件並將其標記為主要。 Spring將自動連接ServiceModelToSwagger2Mapper抽象類的實現。
@Component
@Primary
@Slf4j
public class ServiceModelToSwagger2MapperExtensionImpl extends ServiceModelToSwagger2MapperImpl {
例如,您希望它讀取文件的內容並將其放在示例字段中:
@Override
protected Map<String, Response> mapResponseMessages(Set<ResponseMessage> from) {
Map<String, Response> responses = super.mapResponseMessages(from);
responses.forEach((key, response)-> {
Map<String, Object> examples = response.getExamples();
examples.entrySet().forEach(example -> {
Object exampleObject = example.getValue();
if (exampleObject instanceof String) {
String exampleValue = (String) exampleObject;
if (exampleValue.startsWith("file:")) {
String fileContent = readFileContent(exampleValue);
example.setValue(fileContent);
}
}});
});
return responses;
}
private String readFileContent(String example) {
String fileContent = "";
try {
String fileName = example.replace("file:", "");
File resource = new ClassPathResource(fileName).getFile();
if(resource.exists()) {
fileContent
= new String(Files.readAllBytes(resource.toPath()));
}
} catch (
IOException e) {
log.error("Cannot read swagger documentation from file {}", example);
}
return fileContent;
}
這是控制器中用法的示例:
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK",
examples = @Example(value = @ExampleProperty(mediaType = "application/vnd.siren+json",
value = "file:/data/controller-responses/reponse.json")))
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.