feat(extension/crud): CrudService 增加 Valid 校验注解,Controller 层使用 Valid 替换部分 Validated 注解

在 Service 层实现类添加 Validated 注解即可开启 Service 层校验
This commit is contained in:
2025-07-04 21:24:29 +08:00
parent 223236aad3
commit cce1b5560b
2 changed files with 24 additions and 15 deletions

View File

@@ -22,6 +22,7 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.enums.ParameterIn;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -65,7 +66,7 @@ public abstract class AbstractCrudController<S extends CrudService<L, D, Q, C>,
@Operation(summary = "分页查询列表", description = "分页查询列表") @Operation(summary = "分页查询列表", description = "分页查询列表")
@ResponseBody @ResponseBody
@GetMapping @GetMapping
public BasePageResp<L> page(@Validated Q query, @Validated PageQuery pageQuery) { public BasePageResp<L> page(@Valid Q query, @Valid PageQuery pageQuery) {
return baseService.page(query, pageQuery); return baseService.page(query, pageQuery);
} }
@@ -80,7 +81,7 @@ public abstract class AbstractCrudController<S extends CrudService<L, D, Q, C>,
@Operation(summary = "查询列表", description = "查询列表") @Operation(summary = "查询列表", description = "查询列表")
@ResponseBody @ResponseBody
@GetMapping("/list") @GetMapping("/list")
public List<L> list(@Validated Q query, @Validated SortQuery sortQuery) { public List<L> list(@Valid Q query, @Valid SortQuery sortQuery) {
return baseService.list(query, sortQuery); return baseService.list(query, sortQuery);
} }
@@ -95,7 +96,7 @@ public abstract class AbstractCrudController<S extends CrudService<L, D, Q, C>,
@Operation(summary = "查询树列表", description = "查询树列表") @Operation(summary = "查询树列表", description = "查询树列表")
@ResponseBody @ResponseBody
@GetMapping("/tree") @GetMapping("/tree")
public List<Tree<Long>> tree(@Validated Q query, @Validated SortQuery sortQuery) { public List<Tree<Long>> tree(@Valid Q query, @Valid SortQuery sortQuery) {
return baseService.tree(query, sortQuery, false); return baseService.tree(query, sortQuery, false);
} }
@@ -124,7 +125,8 @@ public abstract class AbstractCrudController<S extends CrudService<L, D, Q, C>,
@Operation(summary = "创建数据", description = "创建数据") @Operation(summary = "创建数据", description = "创建数据")
@ResponseBody @ResponseBody
@PostMapping @PostMapping
public IdResp<Long> create(@Validated(CrudValidationGroup.Create.class) @RequestBody C req) { @Validated(CrudValidationGroup.Create.class)
public IdResp<Long> create(@RequestBody @Valid C req) {
return new IdResp<>(baseService.create(req)); return new IdResp<>(baseService.create(req));
} }
@@ -139,7 +141,8 @@ public abstract class AbstractCrudController<S extends CrudService<L, D, Q, C>,
@Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH) @Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH)
@ResponseBody @ResponseBody
@PutMapping("/{id}") @PutMapping("/{id}")
public void update(@Validated(CrudValidationGroup.Update.class) @RequestBody C req, @PathVariable("id") Long id) { @Validated(CrudValidationGroup.Update.class)
public void update(@RequestBody @Valid C req, @PathVariable("id") Long id) {
baseService.update(req, id); baseService.update(req, id);
} }
@@ -166,7 +169,7 @@ public abstract class AbstractCrudController<S extends CrudService<L, D, Q, C>,
@Operation(summary = "批量删除数据", description = "批量删除数据") @Operation(summary = "批量删除数据", description = "批量删除数据")
@ResponseBody @ResponseBody
@DeleteMapping @DeleteMapping
public void batchDelete(@Validated @RequestBody IdsReq req) { public void batchDelete(@RequestBody @Valid IdsReq req) {
baseService.delete(req.getIds()); baseService.delete(req.getIds());
} }
@@ -181,7 +184,7 @@ public abstract class AbstractCrudController<S extends CrudService<L, D, Q, C>,
@ExcludeFromGracefulResponse @ExcludeFromGracefulResponse
@Operation(summary = "导出数据", description = "导出数据") @Operation(summary = "导出数据", description = "导出数据")
@GetMapping("/export") @GetMapping("/export")
public void export(@Validated Q query, @Validated SortQuery sortQuery, HttpServletResponse response) { public void export(@Valid Q query, @Valid SortQuery sortQuery, HttpServletResponse response) {
baseService.export(query, sortQuery, response); baseService.export(query, sortQuery, response);
} }
} }

View File

@@ -18,10 +18,14 @@ package top.continew.starter.extension.crud.service;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.validation.annotation.Validated;
import top.continew.starter.extension.crud.model.query.PageQuery; import top.continew.starter.extension.crud.model.query.PageQuery;
import top.continew.starter.extension.crud.model.query.SortQuery; import top.continew.starter.extension.crud.model.query.SortQuery;
import top.continew.starter.extension.crud.model.resp.BasePageResp; import top.continew.starter.extension.crud.model.resp.BasePageResp;
import top.continew.starter.extension.crud.model.resp.LabelValueResp; import top.continew.starter.extension.crud.model.resp.LabelValueResp;
import top.continew.starter.extension.crud.validation.CrudValidationGroup;
import java.util.List; import java.util.List;
@@ -44,7 +48,7 @@ public interface CrudService<L, D, Q, C> {
* @param pageQuery 分页查询条件 * @param pageQuery 分页查询条件
* @return 分页列表信息 * @return 分页列表信息
*/ */
BasePageResp<L> page(Q query, PageQuery pageQuery); BasePageResp<L> page(@Valid Q query, @Valid PageQuery pageQuery);
/** /**
* 查询列表 * 查询列表
@@ -53,7 +57,7 @@ public interface CrudService<L, D, Q, C> {
* @param sortQuery 排序查询条件 * @param sortQuery 排序查询条件
* @return 列表信息 * @return 列表信息
*/ */
List<L> list(Q query, SortQuery sortQuery); List<L> list(@Valid Q query, @Valid SortQuery sortQuery);
/** /**
* 查询树列表 * 查询树列表
@@ -67,7 +71,7 @@ public interface CrudService<L, D, Q, C> {
* @param isSimple 是否为简单树结构(不包含基本树结构之外的扩展字段,简单树(下拉列表)使用全局配置结构,复杂树(表格)使用 @DictField 局部配置) * @param isSimple 是否为简单树结构(不包含基本树结构之外的扩展字段,简单树(下拉列表)使用全局配置结构,复杂树(表格)使用 @DictField 局部配置)
* @return 树列表信息 * @return 树列表信息
*/ */
List<Tree<Long>> tree(Q query, SortQuery sortQuery, boolean isSimple); List<Tree<Long>> tree(@Valid Q query, @Valid SortQuery sortQuery, boolean isSimple);
/** /**
* 查询详情 * 查询详情
@@ -85,7 +89,7 @@ public interface CrudService<L, D, Q, C> {
* @return 字典列表信息 * @return 字典列表信息
* @since 2.1.0 * @since 2.1.0
*/ */
List<LabelValueResp> listDict(Q query, SortQuery sortQuery); List<LabelValueResp> listDict(@Valid Q query, @Valid SortQuery sortQuery);
/** /**
* 创建 * 创建
@@ -93,7 +97,8 @@ public interface CrudService<L, D, Q, C> {
* @param req 创建请求参数 * @param req 创建请求参数
* @return 自增 ID * @return 自增 ID
*/ */
Long create(C req); @Validated(CrudValidationGroup.Create.class)
Long create(@Valid C req);
/** /**
* 修改 * 修改
@@ -101,14 +106,15 @@ public interface CrudService<L, D, Q, C> {
* @param req 修改请求参数 * @param req 修改请求参数
* @param id ID * @param id ID
*/ */
void update(C req, Long id); @Validated(CrudValidationGroup.Update.class)
void update(@Valid C req, Long id);
/** /**
* 删除 * 删除
* *
* @param ids ID 列表 * @param ids ID 列表
*/ */
void delete(List<Long> ids); void delete(@NotEmpty(message = "ID 不能为空") List<Long> ids);
/** /**
* 导出 * 导出
@@ -117,5 +123,5 @@ public interface CrudService<L, D, Q, C> {
* @param sortQuery 排序查询条件 * @param sortQuery 排序查询条件
* @param response 响应对象 * @param response 响应对象
*/ */
void export(Q query, SortQuery sortQuery, HttpServletResponse response); void export(@Valid Q query, @Valid SortQuery sortQuery, HttpServletResponse response);
} }