我有一个场景,在这个场景中,我需要openapi3和swagger 2格式的api文档。我目前使用gradle io.swagger.v3模型生成openapi3文档,并分别使用openapicustomiser和securityscheme提供相关的模式约束和oauth2定义。
我意识到我可以使用springfox.documentation中的docket类来返回swagger 2文档,但是我想包括我从openapicustomiser获得的oauth定义和模式约束,所有这些都可以翻译到swagger 2。这可能吗?
如果有帮助的话,我可以这样使用io.swagger库来定义openapi文档:
招摇过市
@EnableSwagger2
@Configuration
public class SwaggerConfig {
...
private final SwaggerConfigUtil util = new SwaggerConfigUtil();
private SecurityScheme applicationIdSecurityScheme() {
return new SecurityScheme().type(SecurityScheme.Type.OAUTH2)
.flows(new OAuthFlows()
.implicit(new OAuthFlow()
.authorizationUrl(adV2TokenUrl)
.scopes(new Scopes()
.addString("openid", "openid")
)
)
);
}
...
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(apiInfo())
.schemaRequirement("OAuth2", applicationIdSecurityScheme())
.addSecurityItem(new SecurityRequirement().addList("OAuth2"));
}
@Bean
public OpenApiCustomiser openApiCustomiser() {
return openApi -> {
openApi.getPaths().forEach((s, p) -> {
util.operationConstraints(p.getGet());
util.operationConstraints(p.getDelete());
util.operationConstraints(p.getHead());
util.operationConstraints(p.getOptions());
util.operationConstraints(p.getPatch());
util.operationConstraints(p.getPost());
util.operationConstraints(p.getPut());
util.operationConstraints(p.getTrace());
});
openApi.getComponents().getSchemas().values().forEach(s -> {
s.setAdditionalProperties(false);
util.propertyContraints(s.getProperties());
});
};
}
}
招摇过市
public class SwaggerConfigUtil {
private final int INT_MIN = Integer.MIN_VALUE;
private final int INT_MAX = Integer.MAX_VALUE;
private final int DEFAULT_LENGTH = 255;
private final String DEFAULT_PATTERN = "^.*$";
private final Map<Class<?>, Function<Schema, Integer>> SET_SCHEMA_CONTRAINTS =
Stream.of(
new AbstractMap.SimpleEntry<Class<?>, Function<Schema, Integer>>(StringSchema.class, this::setStringContraints),
new AbstractMap.SimpleEntry<Class<?>, Function<Schema, Integer>>(DateSchema.class, this::setStringContraints),
new AbstractMap.SimpleEntry<Class<?>, Function<Schema, Integer>>(DateTimeSchema.class, this::setStringContraints),
new AbstractMap.SimpleEntry<Class<?>, Function<Schema, Integer>>(ArraySchema.class, this::setArrayContraints),
new AbstractMap.SimpleEntry<Class<?>, Function<Schema, Integer>>(IntegerSchema.class, this::setIntegerConstraints),
new AbstractMap.SimpleEntry<Class<?>, Function<Schema, Integer>>(NumberSchema.class, this::setIntegerConstraints))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
private final ApiResponse responseDefault = new ApiResponse();
private final ApiResponses defaultApiResponses = new ApiResponses().addApiResponse("default", new ApiResponse());
public void operationConstraints(Operation operation){
if(operation != null){
setApiResponses(operation.getResponses());
if(operation.getParameters() != null){
paramConstraints(operation.getParameters());
}
}
}
public void setApiResponses(ApiResponses responses){
if(responses != null){
responseContraints(responses);
}
}
public void paramConstraints(List<Parameter> parameters){
parameters.forEach(p -> {
Schema s = p.getSchema();
if(s != null){
schemaConstraints(s);
}
});
}
public void contentConstraints(Content content){
MediaType m = content.get("application/json");
System.out.println(m);
if(m != null) {
Schema s = m.getSchema();
schemaConstraints(s);
}
}
public void schemaConstraints(Schema s){
Class c = s.getClass();
SET_SCHEMA_CONTRAINTS.getOrDefault(c, (v)->1).apply(s);
}
public void propertyContraints(Map properties){
Iterator<Map.Entry> iter = properties.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry s = iter.next();
Schema value = (Schema)s.getValue();
schemaConstraints(value);
}
}
public void responseContraints(ApiResponses responses){
Iterator<Map.Entry<String,ApiResponse>> iter = responses.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry a = iter.next();
ApiResponse val = (ApiResponse)a.getValue();
Content c = val.getContent();
contentConstraints(c);
}
}
public int setStringContraints(Schema schema){
if(schema.getMaxLength() == null){
schema.setMaxLength(DEFAULT_LENGTH);
}
if(schema.getPattern() == null){
schema.setPattern(DEFAULT_PATTERN);
}
return 0;
}
public int setArrayContraints(Schema schema){
ArraySchema arraySchema = (ArraySchema) schema;
if(arraySchema.getMaxItems() == null){
arraySchema.setMaxItems(DEFAULT_LENGTH);
}
Schema items = arraySchema.getItems();
setItemConstraints(items);
return 0;
}
public int setItemConstraints(Schema items){
schemaConstraints(items);
Map properties = items.getProperties();
if(properties != null){
propertyContraints(properties);
}
return 0;
}
public int setIntegerConstraints(Schema schema){
if(schema.getMinimum() == null){
schema.setMinimum((BigDecimal.valueOf(INT_MIN)));
}
if(schema.getMaximum() == null){
schema.setMaximum((BigDecimal.valueOf(INT_MAX)));
}
return 0;
}
}
暂无答案!
目前还没有任何答案,快来回答吧!