提交 ae8d2947 编写于 作者: 查尔斯-BUG万象集's avatar 查尔斯-BUG万象集

refactor: 优化 springdoc-openapi 对象型参数处理

1.使用 default-flat-param-object 全局设置对象型参数展示形式。此设置是在 springdoc-openapi v1.6.11 版本开始添加的新特性(详情请参阅:https://github.com/springdoc/springdoc-openapi/pull/1805),在此之前,只能在所有需要处理的对象型参数类上使用 @ParameterObject,工作量较大。
2.作者在使用上方这个配置时还遇到了一个 Bug,那就是只要在对象型参数前使用了注解,例如:@Validated PageQuery pageQuery,这个配置就不会生效了。此问题已在 GitHub 提交了相应 issue(详情请参阅:https://github.com/springdoc/springdoc-openapi/issues/2181),并且 springdoc-openapi 社区某个小伙伴儿已在当前最新发布的 v2.1.0 和 v1.7.0 中修复。
注意:由于当前使用的 Knife4j 版本其内部引入的 springdoc-openapi 相关依赖非最新版本,所以为了解决配置不生效问题,暂时将部分对象型参数移除了 @Validated 注解(除了 PageQuery,其他类当前也未实际添加校验,所以直接移除了)。当然如果不想移除的话,也可以从依赖上功夫,即移除 Knife4j 内引入的 springdoc-openapi 相关依赖,然后自行添加 springdoc-openapi 相关依赖并指定最新版本即可。
上级 587698b1
...@@ -75,7 +75,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q, ...@@ -75,7 +75,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Operation(summary = "分页查询列表") @Operation(summary = "分页查询列表")
@ResponseBody @ResponseBody
@GetMapping @GetMapping
public R<PageDataVO<V>> page(@Validated Q query, @Validated PageQuery pageQuery) { public R<PageDataVO<V>> page(Q query, @Validated PageQuery pageQuery) {
this.checkPermission("list"); this.checkPermission("list");
PageDataVO<V> pageDataVO = baseService.page(query, pageQuery); PageDataVO<V> pageDataVO = baseService.page(query, pageQuery);
return R.ok(pageDataVO); return R.ok(pageDataVO);
...@@ -93,7 +93,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q, ...@@ -93,7 +93,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Operation(summary = "查询树列表") @Operation(summary = "查询树列表")
@ResponseBody @ResponseBody
@GetMapping("/tree") @GetMapping("/tree")
public R<List<Tree<Long>>> tree(@Validated Q query, @Validated SortQuery sortQuery) { public R<List<Tree<Long>>> tree(Q query, SortQuery sortQuery) {
this.checkPermission("list"); this.checkPermission("list");
List<Tree<Long>> list = baseService.tree(query, sortQuery, false); List<Tree<Long>> list = baseService.tree(query, sortQuery, false);
return R.ok(list); return R.ok(list);
...@@ -111,7 +111,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q, ...@@ -111,7 +111,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
@Operation(summary = "查询列表") @Operation(summary = "查询列表")
@ResponseBody @ResponseBody
@GetMapping("/list") @GetMapping("/list")
public R<List<V>> list(@Validated Q query, @Validated SortQuery sortQuery) { public R<List<V>> list(Q query, SortQuery sortQuery) {
this.checkPermission("list"); this.checkPermission("list");
List<V> list = baseService.list(query, sortQuery); List<V> list = baseService.list(query, sortQuery);
return R.ok(list); return R.ok(list);
...@@ -197,7 +197,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q, ...@@ -197,7 +197,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
*/ */
@Operation(summary = "导出数据") @Operation(summary = "导出数据")
@GetMapping("/export") @GetMapping("/export")
public void export(@Validated Q query, @Validated SortQuery sortQuery, HttpServletResponse response) { public void export(Q query, SortQuery sortQuery, HttpServletResponse response) {
this.checkPermission("export"); this.checkPermission("export");
baseService.export(query, sortQuery, response); baseService.export(query, sortQuery, response);
} }
......
...@@ -24,7 +24,6 @@ import lombok.Data; ...@@ -24,7 +24,6 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
...@@ -39,7 +38,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts; ...@@ -39,7 +38,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
* @since 2023/2/12 21:30 * @since 2023/2/12 21:30
*/ */
@Data @Data
@ParameterObject
@Schema(description = "排序查询条件") @Schema(description = "排序查询条件")
public class SortQuery implements Serializable { public class SortQuery implements Serializable {
......
...@@ -24,7 +24,6 @@ import lombok.Data; ...@@ -24,7 +24,6 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;
...@@ -37,7 +36,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts; ...@@ -37,7 +36,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
* @since 2023/1/16 23:25 * @since 2023/1/16 23:25
*/ */
@Data @Data
@ParameterObject
@Schema(description = "登录日志查询条件") @Schema(description = "登录日志查询条件")
public class LoginLogQuery implements Serializable { public class LoginLogQuery implements Serializable {
......
...@@ -24,7 +24,6 @@ import lombok.Data; ...@@ -24,7 +24,6 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;
...@@ -37,7 +36,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts; ...@@ -37,7 +36,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
* @since 2023/1/15 11:43 * @since 2023/1/15 11:43
*/ */
@Data @Data
@ParameterObject
@Schema(description = "操作日志查询条件") @Schema(description = "操作日志查询条件")
public class OperationLogQuery implements Serializable { public class OperationLogQuery implements Serializable {
......
...@@ -24,7 +24,6 @@ import lombok.Data; ...@@ -24,7 +24,6 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;
...@@ -37,7 +36,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts; ...@@ -37,7 +36,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
* @since 2023/1/17 23:31 * @since 2023/1/17 23:31
*/ */
@Data @Data
@ParameterObject
@Schema(description = "系统日志查询条件") @Schema(description = "系统日志查询条件")
public class SystemLogQuery implements Serializable { public class SystemLogQuery implements Serializable {
......
...@@ -24,7 +24,6 @@ import lombok.Data; ...@@ -24,7 +24,6 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import top.charles7c.cnadmin.common.constant.StringConsts; import top.charles7c.cnadmin.common.constant.StringConsts;
...@@ -36,7 +35,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts; ...@@ -36,7 +35,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
* @since 2023/1/20 23:07 * @since 2023/1/20 23:07
*/ */
@Data @Data
@ParameterObject
@Schema(description = "在线用户查询条件") @Schema(description = "在线用户查询条件")
public class OnlineUserQuery implements Serializable { public class OnlineUserQuery implements Serializable {
......
...@@ -22,8 +22,6 @@ import lombok.Data; ...@@ -22,8 +22,6 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;
/** /**
...@@ -33,7 +31,6 @@ import top.charles7c.cnadmin.common.annotation.Query; ...@@ -33,7 +31,6 @@ import top.charles7c.cnadmin.common.annotation.Query;
* @since 2023/1/22 17:52 * @since 2023/1/22 17:52
*/ */
@Data @Data
@ParameterObject
@Schema(description = "部门查询条件") @Schema(description = "部门查询条件")
public class DeptQuery implements Serializable { public class DeptQuery implements Serializable {
......
...@@ -22,8 +22,6 @@ import lombok.Data; ...@@ -22,8 +22,6 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;
/** /**
...@@ -33,7 +31,6 @@ import top.charles7c.cnadmin.common.annotation.Query; ...@@ -33,7 +31,6 @@ import top.charles7c.cnadmin.common.annotation.Query;
* @since 2023/2/15 20:21 * @since 2023/2/15 20:21
*/ */
@Data @Data
@ParameterObject
@Schema(description = "菜单查询条件") @Schema(description = "菜单查询条件")
public class MenuQuery implements Serializable { public class MenuQuery implements Serializable {
......
...@@ -22,8 +22,6 @@ import lombok.Data; ...@@ -22,8 +22,6 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;
/** /**
...@@ -33,7 +31,6 @@ import top.charles7c.cnadmin.common.annotation.Query; ...@@ -33,7 +31,6 @@ import top.charles7c.cnadmin.common.annotation.Query;
* @since 2023/2/8 23:04 * @since 2023/2/8 23:04
*/ */
@Data @Data
@ParameterObject
@Schema(description = "角色查询条件") @Schema(description = "角色查询条件")
public class RoleQuery implements Serializable { public class RoleQuery implements Serializable {
......
...@@ -24,7 +24,6 @@ import lombok.Data; ...@@ -24,7 +24,6 @@ import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import top.charles7c.cnadmin.common.annotation.Query; import top.charles7c.cnadmin.common.annotation.Query;
...@@ -37,7 +36,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts; ...@@ -37,7 +36,6 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
* @since 2023/2/20 21:01 * @since 2023/2/20 21:01
*/ */
@Data @Data
@ParameterObject
@Schema(description = "用户查询条件") @Schema(description = "用户查询条件")
public class UserQuery implements Serializable { public class UserQuery implements Serializable {
......
...@@ -16,7 +16,10 @@ ...@@ -16,7 +16,10 @@
package top.charles7c.cnadmin.webapi.controller.common; package top.charles7c.cnadmin.webapi.controller.common;
import java.util.*; import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -25,7 +28,10 @@ import io.swagger.v3.oas.annotations.Operation; ...@@ -25,7 +28,10 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ClassUtil;
...@@ -65,21 +71,21 @@ public class CommonController { ...@@ -65,21 +71,21 @@ public class CommonController {
@Operation(summary = "查询部门树", description = "查询树结构的部门列表") @Operation(summary = "查询部门树", description = "查询树结构的部门列表")
@GetMapping("/tree/dept") @GetMapping("/tree/dept")
public R<List<Tree<Long>>> listDeptTree(@Validated DeptQuery query, @Validated SortQuery sortQuery) { public R<List<Tree<Long>>> listDeptTree(DeptQuery query, SortQuery sortQuery) {
List<Tree<Long>> treeList = deptService.tree(query, sortQuery, true); List<Tree<Long>> treeList = deptService.tree(query, sortQuery, true);
return R.ok(treeList); return R.ok(treeList);
} }
@Operation(summary = "查询菜单树", description = "查询树结构的菜单列表") @Operation(summary = "查询菜单树", description = "查询树结构的菜单列表")
@GetMapping("/tree/menu") @GetMapping("/tree/menu")
public R<List<Tree<Long>>> listMenuTree(@Validated MenuQuery query, @Validated SortQuery sortQuery) { public R<List<Tree<Long>>> listMenuTree(MenuQuery query, SortQuery sortQuery) {
List<Tree<Long>> treeList = menuService.tree(query, sortQuery, true); List<Tree<Long>> treeList = menuService.tree(query, sortQuery, true);
return R.ok(treeList); return R.ok(treeList);
} }
@Operation(summary = "查询角色字典", description = "查询角色字典列表") @Operation(summary = "查询角色字典", description = "查询角色字典列表")
@GetMapping("/dict/role") @GetMapping("/dict/role")
public R<List<LabelValueVO<Long>>> listRoleDict(@Validated RoleQuery query, @Validated SortQuery sortQuery) { public R<List<LabelValueVO<Long>>> listRoleDict(RoleQuery query, SortQuery sortQuery) {
List<RoleVO> list = roleService.list(query, sortQuery); List<RoleVO> list = roleService.list(query, sortQuery);
List<LabelValueVO<Long>> labelValueVOList = roleService.buildDict(list); List<LabelValueVO<Long>> labelValueVOList = roleService.buildDict(list);
return R.ok(labelValueVOList); return R.ok(labelValueVOList);
......
...@@ -57,7 +57,7 @@ public class LogController { ...@@ -57,7 +57,7 @@ public class LogController {
@Log(module = "登录日志") @Log(module = "登录日志")
@Operation(summary = "分页查询登录日志列表") @Operation(summary = "分页查询登录日志列表")
@GetMapping("/login") @GetMapping("/login")
public R<PageDataVO<LoginLogVO>> page(@Validated LoginLogQuery query, @Validated PageQuery pageQuery) { public R<PageDataVO<LoginLogVO>> page(LoginLogQuery query, @Validated PageQuery pageQuery) {
PageDataVO<LoginLogVO> pageDataVO = logService.page(query, pageQuery); PageDataVO<LoginLogVO> pageDataVO = logService.page(query, pageQuery);
return R.ok(pageDataVO); return R.ok(pageDataVO);
} }
...@@ -65,7 +65,7 @@ public class LogController { ...@@ -65,7 +65,7 @@ public class LogController {
@Log(module = "操作日志") @Log(module = "操作日志")
@Operation(summary = "分页查询操作日志列表") @Operation(summary = "分页查询操作日志列表")
@GetMapping("/operation") @GetMapping("/operation")
public R<PageDataVO<OperationLogVO>> page(@Validated OperationLogQuery query, @Validated PageQuery pageQuery) { public R<PageDataVO<OperationLogVO>> page(OperationLogQuery query, @Validated PageQuery pageQuery) {
PageDataVO<OperationLogVO> pageDataVO = logService.page(query, pageQuery); PageDataVO<OperationLogVO> pageDataVO = logService.page(query, pageQuery);
return R.ok(pageDataVO); return R.ok(pageDataVO);
} }
...@@ -73,7 +73,7 @@ public class LogController { ...@@ -73,7 +73,7 @@ public class LogController {
@Log(module = "系统日志") @Log(module = "系统日志")
@Operation(summary = "分页查询系统日志列表") @Operation(summary = "分页查询系统日志列表")
@GetMapping("/system") @GetMapping("/system")
public R<PageDataVO<SystemLogVO>> page(@Validated SystemLogQuery query, @Validated PageQuery pageQuery) { public R<PageDataVO<SystemLogVO>> page(SystemLogQuery query, @Validated PageQuery pageQuery) {
PageDataVO<SystemLogVO> pageDataVO = logService.page(query, pageQuery); PageDataVO<SystemLogVO> pageDataVO = logService.page(query, pageQuery);
return R.ok(pageDataVO); return R.ok(pageDataVO);
} }
......
...@@ -52,7 +52,7 @@ public class OnlineUserController { ...@@ -52,7 +52,7 @@ public class OnlineUserController {
@Operation(summary = "分页查询列表") @Operation(summary = "分页查询列表")
@SaCheckPermission("monitor:online:user:list") @SaCheckPermission("monitor:online:user:list")
@GetMapping @GetMapping
public R<PageDataVO<OnlineUserVO>> page(@Validated OnlineUserQuery query, @Validated PageQuery pageQuery) { public R<PageDataVO<OnlineUserVO>> page(OnlineUserQuery query, @Validated PageQuery pageQuery) {
return R.ok(onlineUserService.page(query, pageQuery)); return R.ok(onlineUserService.page(query, pageQuery));
} }
......
...@@ -47,6 +47,9 @@ logging: ...@@ -47,6 +47,9 @@ logging:
--- ### 接口文档配置 --- ### 接口文档配置
springdoc: springdoc:
# 设置对象型参数的展示形式(设为 true 表示将对象型参数平展开,即对象内的属性直接作为参数展示而不是嵌套在对象内,默认为 false)
# 如果不添加该全局配置,可以在需要如此处理的对象参数类上使用 @ParameterObject
default-flat-param-object: true
swagger-ui: swagger-ui:
path: /swagger-ui.html path: /swagger-ui.html
tags-sorter: alpha tags-sorter: alpha
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册