【问题标题】:How to exclude fields from RequestBody - Swagger如何从 RequestBody 中排除字段 - Swagger
【发布时间】:2020-12-11 15:23:58
【问题描述】:

我有这个 DTO:

public class UserTo extends AbstractBaseTo {

@NotBlank(message = "Name must not be blank")
@Size(min = 2, max = 100, message = "Name length must be between 2 and 100 characters")
private String name;

@Email(message = "Email must accord email pattern")
@NotBlank(message = "Email must not be blank")
@Size(max = 100, message = "Email length must be 100 characters max")
private String email;

@NotBlank(message = "Password must not be blank")
@Size(min = 5, max = 32, message = "Password length must be between 5 and 32 characters")
private String password;
.......

我在我的 UserController 的许多方法中都使用了这个 DTO,但是,例如,在 Login 方法中,我只使用了其中的两个字段:电子邮件和密码。

当我使用 Swagger 为我的 API 创建文档时,它会在 Login 方法的文档中显示 UserTo 的所有字段。我希望它只显示两个字段。我怎样才能做到这一点?我不想创建额外的 DTO(你知道,有 2 或 3 个字段)。我尝试使用 Swagger 的 @RequestBody 注释来创建一些所需 RequestBody 的示例,但它不起作用。

我使用 Spring Boot 和 springfox 3.0.0。

【问题讨论】:

    标签: java spring-boot swagger swagger-ui springfox


    【解决方案1】:

    您可以使用 swagger ui 隐藏参数

    @ApiModelProperty(hidden = true)
    

    您不想显示的字段。但是对于您的 swagger ui 中的每个 api,隐藏字段将被隐藏。

    还有另一种方法需要您创建另一个 dto。您可以创建另一个 Dto 并要求 springfox 显示新的替代 dto 而不是原来的。

        @PostMapping(value = "/someapi")
        @ApiImplicitParams({
                @ApiImplicitParam(
                        name = "request",
                        dataTypeClass = AdditionalModel.class
                )
        })
        public Response hello(@RequestBody Request request){
            return new Response();
        }
    

    这种方法不会让您更改代码,但您需要创建另一个 dto。 此外,您还需要在 Docket Bean 中注册 AdditionalModel。

        @Bean
        public Docket petApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .select()
                    .apis(RequestHandlerSelectors.any())
                    .paths(PathSelectors.any())
                    .build()
                    .pathMapping("/")
               .additionalModels(typeResolver.resolve(AdditionalModel.class));
        }
    

    【讨论】:

    • 感谢您的回复!但是我需要在一个端点上将它们隐藏起来,而在另一个端点上则不会。我认为有一些 Swagger 注释或配置可用于为每个端点自定义 RequestBody,但我不知道该怎么做。
    • 我尝试了 AdditionalModel DTO,但在这种情况下,在 Swagger UI 中我有一个空的示例值。如何解决这个问题?
    • 对不起,如果您没有在其他任何地方使用附加模型,那么您需要手动注册模型,我已经更新了我的答案。
    • 伙计,它有效!你有我的一天!非常感谢你,伙计!
    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多