有一个像这样的自定义响应设置:
public class CustomResponse {
private int id;
private String productName;
private int quantity;
private double price;
// Constructor & along with Getters & Setters
}
Run Code Online (Sandbox Code Playgroud)
我的 ProductController 中的 Swagger:
@RestController
@RequestMapping("/api/v1")
public class ProductController {
@ApiOperation(httpMethod = "GET",
value = "Retrieves reesults based on specific values set in the request parameters.",
notes = "Sends back query results in JSON format after being processed.",
produces = "application/json")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Successful GET command", response = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将该字段添加externalDocs到Springfox生成的 Json 中:
"externalDocs": {
"description": "find more info here",
"url": "https://swagger.io/about"
},
Run Code Online (Sandbox Code Playgroud)
阅读 SpringFox 文档,我明白我需要创建一个plugin来扩展 SpringFox 功能并添加这个字段。我试过:
@Component
@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER + 1002)
@Slf4j
public class ExternalDocSwaggerConfiguration implements ApiListingBuilderPlugin {
@Override
public void apply(final ApiListingContext apiListingContext) {
ObjectVendorExtension ext = new ObjectVendorExtension("externalDocs");
ext.addProperty(new StringVendorExtension("description", "Link externo"));
ext.addProperty(new StringVendorExtension("url", "https://swagger.io/about"));
apiListingContext.apiListingBuilder().extensions(
Collections.singletonList(ext)); // extensions does not exist
}
@Override
public boolean supports(final DocumentationType documentationType) {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我期待添加扩展名,如显示这里用OperationBuilderPlugin,但是没有extensions方法上 …
打包为 war 的 Spring Boot 2.1.0/1 应用程序不支持ServerHttpRequest作为 Rest Controller 中的输入参数,例如:
@GetMapping(produces = APPLICATION_JSON_UTF8_VALUE)
public Flux<Event> findAll(ServerHttpRequest request) {
return eventService.findAll();
}
Run Code Online (Sandbox Code Playgroud)
日志:
java.lang.IllegalStateException: No primary or default constructor found for interface org.springframework.http.server.reactive.ServerHttpRequest
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:219) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:84) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:139) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:126) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:166) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) [spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) [spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) [servlet-api.jar:na]
at …Run Code Online (Sandbox Code Playgroud) 我有一个 Spring Boot 应用程序,它使用 swagger-ui 来公开它的 api。现在,直到我使用 springfox-swagger-ui 版本 2.6.1 为止,我的代码都可以正常工作。但是当我将版本更新到 2.7.0 时,它会抛出一个错误,指出 ApiInfo 方法已被弃用。谁能告诉我一个替代方案,它将尽可能少地修改现有代码并成功运行应用程序,并且信息仍然存在于 Swagger UI 中作为描述。我在这里给出了 swagger 配置的现有代码......
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket productApi() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.select()
.apis(RequestHandlerSelectors.basePackage("com.xyz.abc"))
.paths(regex("/api.*"))
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfo(
"My-Project Api",
"Api for My Project",
"V1",
"NA terms of service url",
new Contact("Team Name", "www.somexyzteamcontact.com, "NA"),
"A license given",
"NA");
}
}
Run Code Online (Sandbox Code Playgroud)
以及我在我的项目中使用的 swagger 的 gradle 依赖项:
compile group: 'io.springfox', name: …Run Code Online (Sandbox Code Playgroud) 从Springfox 3开始,ResponseMessage已被弃用,我们应该使用Response来代替。
如何正确从ResponseMessage迁移到Response以覆盖默认响应错误消息?
这是我要迁移的 springfox 2.9.2 兼容代码的示例:
private static ResponseMessage responseMessageFor401() {
return new ResponseMessageBuilder()
.code( 401 )
.message( "ERROR_MESSAGE_401" )
.responseModel( new ModelRef( "StatusWrapper" ) )
.build();
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试在我的 Spring Boot 项目中生成 Swagger UI。JSON API 文档已生成,但 Swagger UI 没有生成,至少当我输入 swagger ui 地址时得到 404。我的依赖项:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是,当我删除此配置(并且不执行其他操作)时:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Override
protected void addFormatters(FormatterRegistry registry) {
registry.addConverter(new SomeEnumConverter());
registry.addConverter(new AnotherEnumConverter());
}
}
Run Code Online (Sandbox Code Playgroud)
Swagger UI 可以工作。Swagger UI 转换器有问题吗?有解决该问题的方法吗?
我正在设置我的 API 来为 POST 请求生成 JSON 和 XML,并使用以下 Spring Boot 代码:
@PostMapping(
consumes = { APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE },
produces = { APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE }
)
public Game create(
@Valid @RequestBody Game request,
BindingResult bindingResult
) .../
Run Code Online (Sandbox Code Playgroud)
这工作正常,我可以选择 JSON 或 XML 作为media-typeSwagger 中的,但我希望默认字段为 JSON - 目前它始终是XML:
我怎样才能实现这个目标?
我正在尝试在我的 Spring Boot 项目中实现 swagger。我在网上搜索了一下,发现springfox 3.0可能与spring boot 3.0不兼容。我也尝试过旧版本。但我无法做到这一点。我正在使用gradle。
终端错误
构建.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.1'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'practice.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '19'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation("io.springfox:springfox-swagger2:3.0.0")
}
tasks.named('test') {
useJUnitPlatform()
}
Run Code Online (Sandbox Code Playgroud)
主java文件
package practice.example.crud_practice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication
@EnableSwagger2
@RestController
public class …Run Code Online (Sandbox Code Playgroud) 我将Spring用于我的REST API开发。我有一些端点很多的API。当我打开swagger ui时,它看起来很拥挤。
我刚刚读了这篇文章,发现可以根据资源级别对端点进行分组。
我只想知道如何使用Spring的大笔注解来实现。我很高兴有人可以举例说明。
而且我只是想知道我们是否可以重新分组(较高级别的分组)以上述方式得出的分组?
我试图弄清楚如何使用Spring Fox管理两个(或更多)API端点版本。
要对API进行版本控制,我正在通过内容协商使用版本控制,也称为使用Accept标头的版本控制。使用标头信息分别控制每个端点的版本。例如,对于第一版,我使用属性produces:
@Override
@PostMapping(
produces = "application/vnd.company.v1+json")
public ResponseEntity<User> createUser(
Run Code Online (Sandbox Code Playgroud)
对于第二版,我使用:
@Override
@PostMapping(
produces = "application/vnd.company.v2+json",
consumes = "application/vnd.company.v2+json")
public ResponseEntity<User> createUserVersion2(
Run Code Online (Sandbox Code Playgroud)
我不使用consumes第一个(v1)版本,因此如果客户端仅application/json在通话中使用,则默认情况下将调用第一个版本。
我想在Swagger UI上显示两个版本。怎么做?
springfox ×10
spring-boot ×6
swagger ×6
java ×5
spring ×4
rest ×2
swagger-ui ×2
api ×1
swagger-3.0 ×1