Как создать собственное тело запроса POST в SwaggerUI - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь заставить SwaggerUI выглядеть правильно для меня. У меня есть куча методов POST, и SwaggerUI уже генерирует тело ответа и запроса в веб-интерфейсе, однако тело запроса неверно. Как создать собственное тело запроса для моих методов POST?

SpringFoxConfig -

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMethod;

import com.google.common.collect.ImmutableList;

import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SpringFoxConfig {
    @Bean
    public Docket apiDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .useDefaultResponseMessages(false)
                //.globalResponseMessage(RequestMethod.POST, ImmutableList.of(new ResponseMessage(200, "Some global OK message",null)))
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()            
                .apiInfo(getApiInfo()); 
    }

    private ApiInfo getApiInfo() {
        return new ApiInfo("RESTlike API",
                "An Api to call functions",
                "",
                "",
                "",
                "",
                "");
    }
}

Например Схема, отображаемая в пользовательском интерфейсе,

{
"da": "MD5",
  "data": {
    "value": [
      "string"
    ]
  }
}

Это не правильный ввод и он выдаст ошибку. правильный ввод будет в этом примере:

{
"da": "MD5",
"data": "String"
}

Откуда поступают данные схемы и как их изменить / переопределить.

Соответствующий метод будет

@ResponseBody
@PostMapping("/digest")
public StringWrapper digestData(@RequestBody DigestDataContainer params) throws IOException {
    return new StringWrapper(//code);
}

DigestDataContainer просто содержит байтовый массив «data» и перечисление «da»

Редактировать

Хорошо, я выяснил, почему сгенерированное тело ответа неверно, swagger определяет параметры тела запроса, просматривая общедоступные параметры и все геттеры. Поскольку в моих методах нет только методов получения, связанных с параметрами, в пользовательском интерфейсе отображается слишком много информации. Вы можете предотвратить отображение параметра в пользовательском интерфейсе, пометив его как

@ApiModelProperty(required = false, hidden = true)

Однако у меня нет уникального тела для каждого моего метода, я сгруппировал некоторые из них, что приводит к тому, что сгенерированное тело запроса в пользовательском интерфейсе не соответствует методу, в котором оно находится. Поэтому я хочу вообще не показывать тело в пользовательском интерфейсе.

  • Есть ли способ отключить схему модели для запроса?

1 Ответ

1 голос
/ 11 марта 2019

Самый простой (как для меня) способ - использовать объекты DTO.

В вашем случае вместо digestData(@RequestBody DigestDataContainer params) просто используйте метод

@ResponseBody
@PostMapping("/digest")
public StringWrapper digestData(@RequestBody DigestDataContainerDTO ddcDTO) throws IOException {

    DigestDataContainer ddc = new DigestDataContainer(ddcDTO);

    // process your DigestDataContainer object as before
}

, где DigestDataContainerDTO - это

public class DigestDataContainerDTO {
    private String da;
    private String data;
    // getters/setters
}

и DigestDataContainer(ddcDTO) строит DigestDataContainer объект из полей DigestDataContainerDTO.

...