如何使用 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));
    }

}

结果是