Как изменить объявленный тип тела с String на пользовательский тип DTO в Swagger, используя SpringBoot и SpringFox - PullRequest
0 голосов
/ 08 мая 2019

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

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

enter image description here

Чего я хочу добиться, так это иметь String body в java-коде и TestDTO в коде swagger.Как я могу заставить 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;
    }
}

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Я понял это. Два изменения должны быть сделаны.

Во-первых, как в ответе @Dave Pateral * необходимо добавить 1003 *

@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

1 голос
/ 08 мая 2019

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

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