Как скрыть удалить дополнительные параметры тела запроса в Swagger с помощью Springfox

#spring-mvc #swagger #swagger-ui #springfox

#spring-mvc #swagger #swagger-пользовательский интерфейс #springfox

Вопрос:

У меня очень большой 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.

Я пытался найти решение, но ничего не получил, возможно ли это сделать? Пожалуйста, предложите мне какой-нибудь способ добиться этого.

Заранее спасибо.

Ответ №1:

В вашем случае вам следовало бы лучше использовать DTO, которые специфичны для запроса, например, InsertUserDTO, UpdateUserDTO и т. Д. И, Очевидно, не должны содержать никаких методов, за исключением, возможно, простых gettes / setters.

В моем случае то, что я сделал, поскольку я не хотел добавлять еще один уровень абстракции над объектами моего домена (я передаю их в методы контроллера) Я просто хотел скрыть свойства для определенных типов запросов, чтобы они не отображались в 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. Для вставки / обновления / удаления это может быть по-разному. Конечно, это не мешает пользователю отправлять что-то, что все равно будет сериализовано! Документация 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);
}