package org.noear.solonhat.swagger2.integration;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiParam;
import io.swagger.models.*;
import io.swagger.models.parameters.*;
import org.noear.solon.Solon;
import org.noear.solon.Utils;
import org.noear.solon.annotation.Controller;
import org.noear.solon.core.Aop;
import org.noear.solon.core.AopContext;
import org.noear.solon.core.Plugin;
import org.noear.solon.core.handle.*;
import org.noear.solon.core.route.Routing;
import org.noear.solon.core.util.PrintUtil;
import org.noear.solon.core.wrap.ParamWrap;
import org.noear.solonhat.swagger2.EnableSwagger2;
import org.noear.solonhat.swagger2.SwaggerController;
import java.util.LinkedHashMap;
import java.util.Map;
public class XPluginImp implements Plugin {
Swagger swagger;
@Override
public void start(AopContext context) {
if (Solon.app().source().getAnnotation(EnableSwagger2.class) == null) {
return;
}
//创建 swagger bean
swagger = Aop.getOrNew(Swagger.class);
Aop.context().beanBuilderAdd(ApiModel.class, (clz, wrap, anno) -> {
ModelImpl model = new ModelImpl();
model.type(clz.getName());
swagger.addDefinition(clz.getName(), model);
});
Aop.context().beanBuilderAdd(Api.class, (clz, wrap, anno) -> {
Tag tag = new Tag();
tag.name(clz.getName());
swagger.addTag(tag);
});
context.beanMake(SwaggerController.class);
context.beanOnloaded(this::onAppLoadEnd);
PrintUtil.info("SwaggerApi", "url: http://localhost:" + Solon.cfg().serverPort() + "/v2/swagger.json");
}
private void onAppLoadEnd(AopContext context) {
Info info = context.getBean(Info.class);
if (info != null) {
swagger.info(info);
}
swagger.host("localhost:" + Solon.global().port());
swagger.basePath("/");
swagger.scheme(Scheme.HTTP);
buildTags();
buildPaths();
}
private void buildTags() {
Aop.context().beanForeach((bw) -> {
if (bw.annotationGet(Controller.class) != null) {
Tag tag = new Tag();
tag.name(bw.clz().getName());
swagger.addTag(tag);
}
});
}
private void buildPaths() {
Map<String, Path> pathMap = new LinkedHashMap<>();
for (Routing<Handler> route : Solon.global().router().getAll(Endpoint.main)) {
if (route.target() instanceof Action) {
Action action = (Action) route.target();
Path path = new Path();
{
switch (route.method()) {
case GET: {
path.get(buildPathPperation(route, true));
break;
}
case POST: {
path.post(buildPathPperation(route, false));
break;
}
case PUT: {
path.put(buildPathPperation(route, false));
break;
}
case DELETE: {
path.delete(buildPathPperation(route, false));
break;
}
case PATCH: {
path.patch(buildPathPperation(route, false));
break;
}
case HTTP: {
//path.get(buildPathPperation(route, true));
if (action.method().getParamWraps().length == 0) {
path.get(buildPathPperation(route, true));
} else {
path.post(buildPathPperation(route, false));
}
//path.put(buildPathPperation(route, false));
//path.delete(buildPathPperation(route, false));
//path.patch(buildPathPperation(route, false));
break;
}
default: {
path.post(buildPathPperation(route, false));
}
}
}
pathMap.put(route.path(), path);
}
}
swagger.setPaths(pathMap);
}
private Operation buildPathPperation(Routing<Handler> route, boolean isGet) {
Action action = (Action) route.target();
Operation operation = new Operation();
operation.addTag(action.controller().clz().getName());
operation.summary(route.path());
if (Utils.isNotEmpty(action.produces())) {
operation.addProduces(action.produces());
} else {
operation.addProduces("*/*");
}
if (Utils.isNotEmpty(action.consumes())) {
operation.addConsumes(action.consumes());
}
//添加请求参数
for (ParamWrap p0 : action.method().getParamWraps()) {
if (p0.getType() == Context.class) {
continue;
}
ApiParam apiParam = p0.getParameter().getAnnotation(ApiParam.class);
String n1 = "{" + p0.getName() + "}";
SerializableParameter p1 = null;
if (route.path().indexOf(n1) > 0) {
p1 = new PathParameter();
} else {
if (isGet) {
p1 = new QueryParameter();
} else {
p1 = new FormParameter();
}
}
p1.setRequired(p1.getRequired());
p1.setName(p0.getName());
p1.setType(p0.getType().getSimpleName());
if (apiParam != null) {
p1.setRequired(apiParam.required());
p1.setName(apiParam.name());
p1.setAccess(apiParam.access());
}
operation.addParameter(p1);
}
return operation;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Solon 的文档框架适配项目
共108个文件
js:48个
css:16个
xml:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 188 浏览量
2024-04-08
11:54:54
上传
评论
收藏 1.82MB ZIP 举报
温馨提示
Solon 的文档框架适配项目
资源推荐
资源详情
资源评论
收起资源包目录
Solon 的文档框架适配项目 (108个子文件)
swagger-ui.css 140KB
bootstrap.min.css 118KB
layui.css 62KB
editormd.min.css 60KB
style.css 22KB
layer.css 14KB
swaggerbootstrapui.css 12KB
iconfont.css 10KB
bootstrap-tabs-x.min.css 6KB
layer.css 5KB
layer.css 5KB
sbuadmin.css 4KB
default.css 1KB
docco.css 1KB
treetable.css 294B
swaggerbootstrapui-md.css 112B
iconfont.eot 40KB
iconfont.eot 9KB
glyphicons-halflings-regular.eot 0B
loading-0.gif 6KB
loading.gif 3KB
loading-2.gif 2KB
loading-1.gif 701B
.gitignore 279B
doc.html 69KB
oauth2-redirect.html 2KB
index.html 1KB
api.ico 66KB
XPluginImp.java 6KB
SwaggerController.java 1KB
SwaggerConfig.java 674B
DemoController.java 613B
TestApp.java 273B
EnableSwagger2.java 183B
swagger-ui-bundle.js 1015KB
swagger-ui-es-bundle.js 1015KB
ace.js 484KB
swagger-ui.js 471KB
swagger-ui-es-bundle-core.js 471KB
swaggerbootstrapui.js 333KB
swagger-ui-standalone-preset.js 322KB
mode-html.js 99KB
jquery-1.12.4.min.js 95KB
showdown.min.js 79KB
worker-json.js 71KB
highlight.pack.js 59KB
iconfont.js 40KB
marked.js 38KB
bootstrap.min.js 36KB
table.js 30KB
bootstrap.min.js 27KB
json5.js 25KB
highlight.js 24KB
mode-xml.js 23KB
layer.js 22KB
html.js 21KB
layer.js 21KB
async.min.js 19KB
template-web.js 16KB
element.js 15KB
i18n.js 15KB
axios.min.js 13KB
clipboard.min.js 10KB
mode-json.js 10KB
md5.min.js 9KB
form.js 9KB
treetable-bak.js 8KB
ace.min.js 8KB
treetable.js 7KB
layui.js 7KB
laypage.js 4KB
bootstrap-tabs-x.min.js 4KB
util.js 3KB
layer.js 3KB
theme-eclipse.js 3KB
sbuadmin.js 2KB
laytpl.js 2KB
json.js 503B
text.js 503B
xml.js 500B
npm.js 484B
mode-text.js 330B
LICENSE 11KB
showdown.min.js.map 90KB
icon.png 11KB
icon-ext.png 6KB
favicon-16x16.png 665B
favicon-32x32.png 628B
solonhat.swagger2.properties 63B
iconfont.svg 274KB
glyphicons-halflings-regular.svg 106KB
iconfont.svg 39KB
iconfont.ttf 40KB
iconfont.ttf 9KB
glyphicons-halflings-regular.ttf 0B
iconfont.woff 26KB
iconfont.woff 6KB
glyphicons-halflings-regular.woff 0B
glyphicons-halflings-regular.woff2 0B
pom.xml 7KB
共 108 条
- 1
- 2
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6656
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功