Как изменить объявленный тип тела со String на пользовательский тип DTO в Swagger с помощью SpringBoot и SpringFox

У меня есть контроллер отдыха с одним методом. Этот метод принимает один аргумент String, аннотированный как @RequestBody. По какой-то причине, не упомянутой здесь, я вынужден использовать тип String и вручную преобразовывать его в TestDTO. С точки зрения потребителя API тело имеет тип TestDTO, и я хочу показать этот тип в SwaggerUI.

К сожалению (что вполне очевидно), чванство показывает, что тело имеет тип String. Посмотрите на картинку ниже.

введите здесь описание изображения

Чего я хочу добиться, так это иметь тело String в коде Java и 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;
    }
}

person Wojciech Wirzbicki    schedule 08.05.2019    source источник


Ответы (2)


Попробуйте поместить эту аннотацию в свой метод:

@ApiImplicitParam(name = "test", value = "testDTO", required = true, dataType = "TestDTO")
person Dave Pateral    schedule 08.05.2019
comment
Это не помогло. Еще один параметр появился в пользовательском интерфейсе swagger. - person Wojciech Wirzbicki; 08.05.2019

Я понял. Необходимо внести два изменения.

Во-первых, как и в ответе @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));
    }

}

И результат: введите здесь описание изображения

person Wojciech Wirzbicki    schedule 20.05.2019