#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);
}