我有非常大的 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 的所有属性。
我试图找到解决方案,但没有得到任何解决方案,这可以吗?请建议我一些方法来实现这一目标。
提前致谢。
在您的情况下,您应该更好地使用特定于请求的 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);
}
将
@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 {
/* 业务逻辑 */ }