我试图让SwaggerUI正确地为我工作。我有一堆POST方法,SwaggerUI已经在Web-UI中生成响应和请求主体,但请求主体不正确。如何为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",
"",
"",
"",
"",
"");
}
}
例如UI中显示的模式是
{
"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只包含一个bytearray'data'和一个enum'da'
编辑
好吧,我发现为什么生成的响应体是错误的,swagger通过查看公共参数和所有getter来确定请求体的参数。由于我的方法中没有与参数相关的getter,因此UI中显示的内容过多。您可以通过使用注释来阻止在UI中显示参数
@ApiModelProperty(required = false, hidden = true)
但是,我没有为我的每一种方法都有一个独特的身体,我已经将它们中的一些组合在一起,这导致UI中生成的请求体不准确到它所处的方法。因此我想不显示UI中的身体。
最简单的(对我来说)方式是使用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
对象。