这是我的控制器请求
@PostMapping("/requestApproval")
@PreAuthorize("hasRole('USER')")
public ResponseEntity<MessageResponse> requestApproval(@DTO(TripIdDTO.class) Trip requestingApprovalTrip) {
this.tripService.requestApproval(requestingApprovalTrip);
return ResponseEntity.ok().body(new MessageResponse("Trip status has been changed to WAITING_FOR_APPROVAL!"));
}
注释从JSON格式获取请求体,将其转换为DTO,然后转换为Trip
实体类型。
Swagger使用Trip实体的字段生成参数。有没有一种方法可以自定义swagger,使用TripIdDTO
类来创建文档的参数,而不是Trip
?
由于该项目不遵守Swagger和Spring Boot之间的常规合同,因此应该进行一些额外的设置以使其按需工作。
步骤1注册真正的API模型
@Configuration
// Only need for swagger 2.9.2
@EnableSwagger2
public class SpringFoxConfig {
@Bean
public Docket api() {
TypeResolver resolver = new TypeResolver();
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build().additionalModels(resolver.resolve(MessageDto.class));
}
}
步骤2告诉Swagger所使用的真正的API模型
@RestController
public class TestController {
@RequestMapping(value = "/message",
produces = {"application/json;charset=utf-8"},
consumes = {"application/json;charset=utf-8"},
method = RequestMethod.POST)
@ApiImplicitParams({
@ApiImplicitParam(name = "request", required = true,
dataType = "MessageDto", paramType = "body")
})
ResponseEntity<?> createMessage(Message message) {
return null;
}
}
通过这样做,我们声明了一个类型为MessageDto
的参数,并且应该从HTTP请求体中获取。
步骤3告诉Swagger忽略已存在的参数
@Data
public class Message {
@ApiModelProperty(hidden = true)
private Integer code = null;
@ApiModelProperty(hidden = true)
private String message = null;
}
Message
类有两个使用公共get
方法归档的类(我认为这也是您的情况(。由于除了Message
之外没有@RequestBody
,Swagger将把Message
的所有字段都当作查询参数。为了使这些无用的部分在API文档中不可见,我们应该将它们标记为隐藏。
P.S
此功能在Swagger 2.9.2中正常工作,而在3.0.0中不起作用。这是一个错误,我想这需要一些时间来修复。您可以在springfox第3435期中找到更多信息。
所有的代码都可以在这个repo-swagger演示中找到。