如何使用 SpringBoot 和 SpringFox 在 Swagger 中将声明的主体类型从 String 更改为自定义 DTO 类型
How to change declared body type from String to custom DTO type in Swagger using SpringBoot and SpringFox
我有一个只有一种方法的休息控制器。此方法采用一个 String
注释为 @RequestBody
的参数。由于此处未提及的某些原因,我不得不使用类型 String
并手动将其转换为 TestDTO
。从 API 的消费者角度来看,正文是 TestDTO
类型,我想在 SwaggerUI 中显示此类型。
不幸的是(这很明显)swagger 表明 body 是 String
的类型。看下图。
我想要实现的是在 java 代码中包含 String
主体,在 swagger 代码中包含 TestDTO
。如何强制 Swagger 显示它?我试图找到注释及其属性,但失败了。
休息控制器代码如下:
@RestController
@Api(tags = { "test" }, description = "test related resources")
public class TestController {
@Autowired
ObjectMapper mapper;
@RequestMapping(path = "/test", method = RequestMethod.POST)
public void confirm(@RequestBody String requestBody) throws IOException {
//do sth with body
TestDTO dto = mapper.readValue(requestBody, TestDTO.class);
//do sth with dto
}
}
class TestDTO{
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
尝试将此注释放在您的方法上:
@ApiImplicitParam(name = "test", value = "testDTO", required = true, dataType = "TestDTO")
我明白了。需要进行两个更改。
首先,必须添加@Dave Pateral 的回答@ApiImplicitParams
@RestController
@Api(tags = { "test" }, description = "test related resources")
public class TestController {
@Autowired
ObjectMapper mapper;
@ApiImplicitParams({
@ApiImplicitParam(name = "requestBody", required = true,
dataType = "TestDTO", paramType = "body")
})
@RequestMapping(path = "/test", method = RequestMethod.POST)
public void confirm(@RequestBody String requestBody) throws IOException {
//do sth with body
TestDTO dto = mapper.readValue(requestBody, TestDTO.class);
//do sth with dto
}
}
然后必须在摘要中注册隐式模型,下面是最小的工作示例
@Configuration
public class SwaggerConfiguration {
@Autowired
private TypeResolver typeResolver;
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2)
.additionalModels(typeResolver.resolve(TestDTO.class));
}
}
结果是
我有一个只有一种方法的休息控制器。此方法采用一个 String
注释为 @RequestBody
的参数。由于此处未提及的某些原因,我不得不使用类型 String
并手动将其转换为 TestDTO
。从 API 的消费者角度来看,正文是 TestDTO
类型,我想在 SwaggerUI 中显示此类型。
不幸的是(这很明显)swagger 表明 body 是 String
的类型。看下图。
我想要实现的是在 java 代码中包含 String
主体,在 swagger 代码中包含 TestDTO
。如何强制 Swagger 显示它?我试图找到注释及其属性,但失败了。
休息控制器代码如下:
@RestController
@Api(tags = { "test" }, description = "test related resources")
public class TestController {
@Autowired
ObjectMapper mapper;
@RequestMapping(path = "/test", method = RequestMethod.POST)
public void confirm(@RequestBody String requestBody) throws IOException {
//do sth with body
TestDTO dto = mapper.readValue(requestBody, TestDTO.class);
//do sth with dto
}
}
class TestDTO{
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
尝试将此注释放在您的方法上:
@ApiImplicitParam(name = "test", value = "testDTO", required = true, dataType = "TestDTO")
我明白了。需要进行两个更改。
首先,必须添加@Dave Pateral 的回答@ApiImplicitParams
@RestController
@Api(tags = { "test" }, description = "test related resources")
public class TestController {
@Autowired
ObjectMapper mapper;
@ApiImplicitParams({
@ApiImplicitParam(name = "requestBody", required = true,
dataType = "TestDTO", paramType = "body")
})
@RequestMapping(path = "/test", method = RequestMethod.POST)
public void confirm(@RequestBody String requestBody) throws IOException {
//do sth with body
TestDTO dto = mapper.readValue(requestBody, TestDTO.class);
//do sth with dto
}
}
然后必须在摘要中注册隐式模型,下面是最小的工作示例
@Configuration
public class SwaggerConfiguration {
@Autowired
private TypeResolver typeResolver;
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2)
.additionalModels(typeResolver.resolve(TestDTO.class));
}
}
结果是