如何使用SpringBoot和SpringFox在Swagger中将声明的主体类型从String更改为自定义DTO类型

时间:2019-05-08 10:56:05

标签: java swagger swagger-ui spring-restcontroller springfox

我有一种方法的休息控制器。此方法采用一个标注为String的{​​{1}}参数。由于此处未提及的原因,我被迫使用类型@RequestBody并将其手动转换为String。从API使用者的角度来看,正文是TestDTO的类型,我想在SwaggerUI中显示这种类型。

不幸的是(很明显),张扬地显示出主体是TestDTO的类型。看下面的图片。

enter image description here

我想要实现的是在Java代码中包含String主体,在swagger代码中包含String。如何强制Swagger显示?我试图找到注释及其属性,但失败了。

以下其他控制器代码:

TestDTO

2 个答案:

答案 0 :(得分:1)

尝试将此注释放在您的方法上:

@ApiImplicitParam(name = "test", value = "testDTO", required = true, dataType = "TestDTO")

答案 1 :(得分:1)

我知道了。需要进行两项更改。

首先,就像@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));
    }

}

结果是 enter image description here