我有一个自定义注释@DTO,它将主体从DTO转换为实体,然而swagger使用实体来创建参数,而不是DTO



这是我的控制器请求

@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演示中找到。

相关内容

  • 没有找到相关文章

最新更新