Mic*_*man 0 swagger swagger-ui spring-boot springfox
调查Springfox和Swagger UI,但我遇到了一个问题.我使用Spring Boot REST示例项目作为我的PoC的基础.我正在运行JDK 8,该项目利用了Gradle.
首先,这是项目的文件内容:
的build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.7.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
jar {
baseName = 'gs-rest-service'
version = '0.1.0'
}
repositories {
mavenCentral()
jcenter()
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
compile("io.springfox:springfox-swagger2:2.2.2")
compile("io.springfox:springfox-swagger-ui:2.2.2")
testCompile("junit:junit")
}
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}
Run Code Online (Sandbox Code Playgroud)
GreetingController.java
package hello;
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
}
Run Code Online (Sandbox Code Playgroud)
Greeting.java
package hello;
public class Greeting {
private final long id;
private final String content;
public Greeting(long id, String content) {
this.id = id;
this.content = content;
}
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
Run Code Online (Sandbox Code Playgroud)
Application.java
package hello;
import static com.google.common.collect.Lists.newArrayList;
import static springfox.documentation.schema.AlternateTypeRules.newRule;
import java.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.request.async.DeferredResult;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.schema.WildcardType;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import com.fasterxml.classmate.TypeResolver;
@SpringBootApplication
@EnableSwagger2
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Autowired
private TypeResolver typeResolver;
@Bean
public Docket greetingApi() {
return new Docket(DocumentationType.SPRING_WEB)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.pathMapping("/")
.directModelSubstitute(LocalDate.class, String.class)
.genericModelSubstitutes(ResponseEntity.class)
.alternateTypeRules(newRule(typeResolver.resolve(DeferredResult.class,
typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
typeResolver.resolve(WildcardType.class)))
.useDefaultResponseMessages(false)
.globalResponseMessage(RequestMethod.GET,
newArrayList(new ResponseMessageBuilder()
.code(500)
.message("500 message")
.responseModel(new ModelRef("Error"))
.build()))
.enableUrlTemplating(true);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我面临的问题.当我构建并运行应用程序时,我可以成功导航到Swagger UI页面(http:// localhost:8080/swagger-ui.html).当我展开greeting-controller时,我会看到不同的方法并展开"get/greeting {?name}".Get部分包含以下内容:
Response Class (Status 200)
Model
{
"content": "string",
"id": 0
}
Response Content Type: */*
Parameters
parameter = name, value = World, parameter type = query, data type = string
Run Code Online (Sandbox Code Playgroud)
当我点击"试一试"按钮时,我看到以下内容:
curl = curl -X GET --header "Accept: */*" "http://localhost:8080/greeting{?name}?name=World"
request url = http://localhost:8080/greeting{?name}?name=World
repsonse body = {
"timestamp": 1446418006199,
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/greeting%7B"
}
response code = 404
response headers = {
"server": "Apache-Coyote/1.1",
"content-type": "application/json;charset=UTF-8",
"transfer-encoding": "chunked",
"date": "Sun, 01 Nov 2015 22:46:46 GMT"
}
Run Code Online (Sandbox Code Playgroud)
乍一看,由于某些原因,Springfox/Swagger没有正确替换{?name}的占位符.我的问题是,我如何配置它,如果这实际上是问题,那么我可以从Swagger UI页面成功测试服务?
在您的Application班级中,将其更改enableUrlTemplating为false将解决您的问题.
@Bean
public Docket greetingApi() {
return new Docket(DocumentationType.SPRING_WEB)
//...
.enableUrlTemplating(false);
}
Run Code Online (Sandbox Code Playgroud)
只是该旗帜的一点背景.该标志是为了支持RFC 6570,没有这个标准,只有查询字符串参数不同的操作才会按规范正确显示.在swagger规范的下一次迭代中,有计划解决这个问题.这就是enableUrlTemplating被标记为孵化功能的原因.
| 归档时间: |
|
| 查看次数: |
3025 次 |
| 最近记录: |