如何使用 Springfox 在 Swagger 中隐藏删除额外的请求正文参数

问题描述 投票:0回答:2

我有非常大的 UserDto 有很多字段,如下所示:

public class UserDto implements Serializable {
    private Long id;
    @Column
    private String username;
    @Column
    private String emailId;
    @Column
    private String password;

    .... many other columns like above with getter/setter
}

我定义了身份验证方法如下:

    @RequestMapping(value = "authenticate", consumes = "application/json", produces = "application/json", method = RequestMethod.POST)
        @ApiOperation(value="authenticate user",notes="authenticate user for all roles")
        @ApiResponses( {
            @ApiResponse( code = 403, message = "BAD_CREDENCIAL_EXCEPTION",response=ExceptionMsgDto.class),
            @ApiResponse( code = 404, message = "USERNAME_NOT_FOUND_EXCEPTION",response=ExceptionMsgDto.class)
        } )
        public ResponseEntity<Object> authenticate(@RequestBody UserDto userDto, HttpServletRequest request)
                throws Exception {
  /* business logic */
}

当我生成 swagger 时,它会显示请求模型内 Userdto 的所有属性,但我只想显示用户名/密码并希望隐藏其他属性。但同时对于 createUser 方法,我想显示 UserDto 的所有属性。

我试图找到解决方案,但没有得到任何解决方案,这可以吗?请建议我一些方法来实现这一目标。

提前致谢。

spring-mvc swagger swagger-ui springfox
2个回答
2
投票

在您的情况下,您应该更好地使用特定于请求的 DTO,例如 InsertUserDTO、UpdateUserDTO 等。显然,除了简单的 gettes/setter 之外,不应包含任何方法。

就我而言,我所做的事情是因为我不想在域对象上添加另一个抽象层(我在控制器方法中传递这些抽象层),我只是想隐藏特定请求类型的属性,这样它们就不会显示在 Swagger 上(版本 2.6.1)。

这就是我所做的:

我的域对象:

public class Entity {
   private String name;
   private String hideThis;

   public String getName() { return name; }
   public void setName(String name) { this.name = name; }

   public String getHideThis() { return hideThis; }
   public void setHideThis(String hideThis) { this.hideThis= hideThis; }
}

我注释了所有我想隐藏的属性!即使与私有财产一起工作:)

import io.swagger.annotations.ApiModelProperty;
public class EntityInsertRequest extends Entity {    

   @ApiModelProperty(hidden = true)
   private User hideThis;

}

这样我就可以控制请求正文在 swagger ui 中的外观。插入/更新/删除可能会有所不同。当然,这并不能阻止用户发送仍将被序列化的内容!假设您可以防止随机值/对象传递到后端,则 api 的文档很干净,没有额外的 DTO 层。

这是我之前的控制器方法:

@RequestMapping(value = "entity", method = RequestMethod.POST)
public Entity storeEntity(@RequestBody final Entity in) {

    return entityService.store(in);
}

这是我的控制器方法:

@RequestMapping(value = "entity", method = RequestMethod.POST)
public Entity storeEntity(@RequestBody final EntityInsertRequest in) {

   return entityService.store(in);
}

0
投票

@Parameter(hidden = true)
注释添加到您的 RequestBody 参数中:

    @RequestMapping(value = "authenticate", consumes = "application/json", produces = "application/json", method = RequestMethod.POST)
    @ApiOperation(value="authenticate user",notes="authenticate user for all roles")
    @ApiResponses( {
        @ApiResponse( code = 403, message = "BAD_CREDENCIAL_EXCEPTION",response=ExceptionMsgDto.class),
        @ApiResponse( code = 404, message = "USERNAME_NOT_FOUND_EXCEPTION",response=ExceptionMsgDto.class)
    } )
    public ResponseEntity<Object> authenticate(@Parameter(hidden = true) @RequestBody UserDto userDto, HttpServletRequest request)
            throws Exception {

/* 业务逻辑 */ }

© www.soinside.com 2019 - 2024. All rights reserved.