我在将war应用程序迁移到
spring boot jar应用程序时遇到了问题.
我正在使用spring boot 1.4.1和swagger 2.6.0.
要在战争中自定义swagger ui,您必须将自定义swagger-ui.html放到/ webapp目录中.在spring boot中,不建议使用webapp目录,因为它在捆绑的jar中不起作用.但是,swagger会忽略将自定义swagger-ui.html放到/ resources / static中.
有没有简单的解决方案(而不是将整个swagger分发添加到我的应用程序中)?
我的自定义swagger-ui.html看起来像
<!DOCTYPE html> <html> <head> <Meta charset="UTF-8"> <title>API</title> <link rel="icon" type="image/png" href="webjars/springfox-swagger-ui/images/favicon-32x32.png" sizes="32x32"/> <link rel="icon" type="image/png" href="webjars/springfox-swagger-ui/images/favicon-16x16.png" sizes="16x16"/> <link href='webjars/springfox-swagger-ui/css/typography.css' media='screen' rel='stylesheet' type='text/css'/> <link href='webjars/springfox-swagger-ui/css/reset.css' media='screen' rel='stylesheet' type='text/css'/> <link href='webjars/springfox-swagger-ui/css/screen.css' media='screen' rel='stylesheet' type='text/css'/> <link href='webjars/springfox-swagger-ui/css/reset.css' media='print' rel='stylesheet' type='text/css'/> <link href='webjars/springfox-swagger-ui/css/print.css' media='print' rel='stylesheet' type='text/css'/> <script src='webjars/springfox-swagger-ui/lib/jquery-1.8.0.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/jquery.slideto.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/jquery.wiggle.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/jquery.ba-bbq.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/handlebars-2.0.0.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/underscore-min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/backbone-min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/swagger-ui.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/highlight.7.3.pack.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/jsoneditor.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/marked.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/swagger-oauth.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/springfox.js' type='text/javascript'></script> <style> .swagger-section #header { background-color: #ff5722; } </style> </head> <body class="swagger-section"> <div id='header'> <div class="swagger-ui-wrap"> <a id="logo" href="http://www.my-app.com">my-app.com API</a> <form id='api_selector'> <div class='input' style="display: none"> <select id="select_baseUrl" name="select_baseUrl"/> </div> <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/> </div> <!-- <div class='input'><input placeholder="Enter authorization token" id="input_apiKey" name="apiKey" type="text"/></div> <div class='input' style="display: none"><a id="explore" href="#" data-sw-translate>Explore</a></div> --> </form> </div> </div> <script type="text/javascript"> function addApiKeyAuthorization() { var key = $('#input_apiKey')[0].value; console.log("key: " + key); if (key && key.trim() != "") { var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization("Authorization",key,"header"); window.swaggerUi.api.clientAuthorizations.add("bearer",apiKeyAuth); //window.authorizations.add("Authorization",new ApiKeyAuthorization("Authorization","query")); console.log("Set authorization token: " + key); } } $('#input_apiKey').change(function () { addApiKeyAuthorization(); }); </script> <div id="message-bar" class="swagger-ui-wrap" data-sw-translate> </div> <div id="swagger-ui-container" class="swagger-ui-wrap"></div> </body> </html>
解决方法
我发现这种简单的方法可以将Swagger自定义为Spring Boot应用程序,只需从原始springfox-swagger-ui复制两个文件
首先,我从SwaggerConfig.java中禁用了@Configuration:
//@Configuration <-- Attention,disable Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket productApi() { return new Docket(DocumentationType.SWAGGER_2) .ignoredParameterTypes(Pageable.class) .select().apis(RequestHandlerSelectors.any()) .paths(regex("/v1/.*")) .build(); } }
然后我扩展了一个WebMvcConfigurerAdapter:
@Configuration @Import(SwaggerConfig.class) public class MvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(final ResourceHandlerRegistry registry) { registry.addResourceHandler("/doc/v1/**").addResourceLocations("classpath:/doc/v1/"); registry.addResourceHandler("/doc/v1/webjars/**").addResourceLocations("classpath:/Meta-INF/resources/webjars/"); } }
然后我只是通过简单的修改将原始文件swagger-ui.html复制到src / main / resources / doc / v1 / api.html中.
我已经取代了这一行:
<script src='webjars/springfox-swagger-ui/springfox.js' type='text/javascript'></script>
用这一行:
<script src='js/swagger.js' type='text/javascript'></script>
这是我的api.html
<!DOCTYPE html> <html> <head> <Meta charset="UTF-8"> <title>Swagger UI</title> <link rel="icon" type="image/png" href="webjars/springfox-swagger-ui/images/favicon-32x32.png" sizes="32x32"/> <link rel="icon" type="image/png" href="webjars/springfox-swagger-ui/images/favicon-16x16.png" sizes="16x16"/> <link href='webjars/springfox-swagger-ui/css/typography.css' media='screen' rel='stylesheet' type='text/css'/> <link href='webjars/springfox-swagger-ui/css/reset.css' media='screen' rel='stylesheet' type='text/css'/> <link href='webjars/springfox-swagger-ui/css/screen.css' media='screen' rel='stylesheet' type='text/css'/> <link href='webjars/springfox-swagger-ui/css/reset.css' media='print' rel='stylesheet' type='text/css'/> <link href='webjars/springfox-swagger-ui/css/print.css' media='print' rel='stylesheet' type='text/css'/> <script src='webjars/springfox-swagger-ui/lib/object-assign-pollyfill.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/jquery-1.8.0.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/jquery.slideto.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/jquery.wiggle.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/jquery.ba-bbq.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/handlebars-4.0.5.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/lodash.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/backbone-min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/swagger-ui.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/highlight.9.1.0.pack.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/highlight.9.1.0.pack_extended.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/jsoneditor.min.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/marked.js' type='text/javascript'></script> <script src='webjars/springfox-swagger-ui/lib/swagger-oauth.js' type='text/javascript'></script> <script src='js/springfox.js' type='text/javascript'></script> </head> <body class="swagger-section"> <div id='header'> <div class="swagger-ui-wrap"> <a id="logo" href="http://swagger.io"><img class="logo__img" alt="swagger" height="30" width="30" src="webjars/springfox-swagger-ui/images/logo_small.png" /><span class="logo__title">swagger</span></a> <form id='api_selector'> <div class='input'> <select id="select_baseUrl" name="select_baseUrl"/> </div> <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div> <div id='auth_container'></div> <div class='input'><a id="explore" class="header__btn" href="#" data-sw-translate>Explore</a></div> </form> </div> </div> <div id="message-bar" class="swagger-ui-wrap" data-sw-translate> </div> <div id="swagger-ui-container" class="swagger-ui-wrap"></div> </body> </html>
之后我将原始的springfox.js复制到src / main / resources / doc / v1 / js / springfox.js中,我已经更改了这些行:
"baseUrl": function() { var urlMatches = /(.*)\/swagger-ui.html.*/.exec(window.location.href); return urlMatches[1]; },
用这些线:
"baseUrl": function() { return window.location.origin; },
这是我完整的springfox.js
$(function() { var springfox = { "baseUrl": function() { return window.location.origin; },"securityConfig": function(cb) { $.getJSON(this.baseUrl() + "/swagger-resources/configuration/security",function(data) { cb(data); }); },"uiConfig": function(cb) { $.getJSON(this.baseUrl() + "/swagger-resources/configuration/ui",function(data) { cb(data); }); } }; window.springfox = springfox; window.oAuthRedirectUrl = springfox.baseUrl() + '/webjars/springfox-swagger-ui/o2c.html'; window.springfox.uiConfig(function(data) { window.swaggerUi = new SwaggerUi({ dom_id: "swagger-ui-container",validatorUrl: data.validatorUrl,supportedSubmitMethods: data.supportedSubmitMethods || ['get','post','put','delete','patch'],docExpansion: data.docExpansion || 'none',jsonEditor: JSON.parse(data.jsonEditor) || false,apisSorter: data.apisSorter || 'alpha',defaultModelRendering: data.defaultModelRendering || 'schema',showRequestHeaders: data.showRequestHeaders || true,timeout: data.requestTimeout,onComplete: function(swaggerApi,swaggerUi) { initializeSpringfox(); if (window.SwaggerTranslator) { window.SwaggerTranslator.translate(); } $('pre code').each(function(i,e) { hljs.highlightBlock(e) }); },onFailure: function(data) { log("Unable to Load SwaggerUI"); },}); initializeBaseUrl(); function addApiKeyAuthorization(security) { var apiKeyVehicle = security.apiKeyVehicle || 'query'; var apiKeyName = security.apiKeyName || 'api_key'; var apiKey = security.apiKey || ''; if (apiKey && apiKey.trim() != "") { var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization(apiKeyName,apiKey,apiKeyVehicle); window.swaggerUi.api.clientAuthorizations.add(apiKeyName,apiKeyAuth); log("added key " + apiKey); } } function log() { if ('console' in window) { console.log.apply(console,arguments); } } function oAuthIsDefined(security) { return security.clientId && security.clientSecret && security.appName && security.realm; } function initializeSpringfox() { var security = {}; window.springfox.securityConfig(function(data) { security = data; addApiKeyAuthorization(security); if (typeof initOAuth == "function" && oAuthIsDefined(security)) { initOAuth(security); } }); } }); $('#select_baseUrl').change(function() { window.swaggerUi.headerView.trigger('update-swagger-ui',{ url: $('#select_baseUrl').val() }); }); function maybePrefix(location,withRelativePath) { var pat = /^https?:\/\//i; if (pat.test(location)) { return location; } return withRelativePath + location; } function initializeBaseUrl() { var relativeLocation = springfox.baseUrl(); $('#input_baseUrl').hide(); $.getJSON(relativeLocation + "/swagger-resources",function(data) { var $urlDropdown = $('#select_baseUrl'); $urlDropdown.empty(); $.each(data,function(i,resource) { var option = $('<option></option>') .attr("value",maybePrefix(resource.location,relativeLocation)) .text(resource.name + " (" + resource.location + ")"); $urlDropdown.append(option); }); $urlDropdown.change(); }); } });
现在您只需要运行应用程序并转到http://localhost:8080/doc/v1/api.html