BUG_FIXES.md 2.9 KB

代码生成器Bug修复报告

修复的问题

1. Pydantic验证错误 - Missing required argument

问题描述:

pydantic_core._pydantic_core.ValidationError: 1 validation error for update_gen_table
dto
  Missing required argument [type=missing_argument, input_value=ArgsKwargs((), {'tableId': 18}), input_type=ArgsKwargs]

根本原因:

  1. 装饰器顺序错误:@PathValidator()@BodyValidator() 之前
  2. 函数参数顺序错误:Pydantic模型参数必须是第一个参数

修复方案:

1.1 修复装饰器顺序

# 修复前
@gen.route('/<int:tableId>', methods=['PUT'])
@PathValidator()
@BodyValidator()
@PreAuthorize(HasPerm('tool:gen:edit'))
@JsonSerializer()
def update_gen_table(dto: GenTablePO, tableId: int):

# 修复后
@gen.route('/<int:tableId>', methods=['PUT'])
@BodyValidator()
@PathValidator()
@PreAuthorize(HasPerm('tool:gen:edit'))
@JsonSerializer()
def update_gen_table(dto: GenTablePO, tableId: int):

1.2 修复函数参数顺序

  • Pydantic模型参数(dto)必须是第一个参数
  • 路径参数(tableId)必须是第二个参数

1.3 修复的文件

  • ruoyi_generator/controller/gen.py - update_gen_table 函数
  • ruoyi_generator/controller/column.py - update_column 函数

2. 装饰器使用规则

正确的装饰器顺序:

@route_decorator
@BodyValidator()      # Body验证器在前
@PathValidator()      # Path验证器在后
@PreAuthorize()       # 权限验证
@JsonSerializer()     # 序列化器
def function_name(dto: ModelClass, path_param: int):

正确的参数顺序:

def function_name(dto: PydanticModel, path_param: int):
    # dto 必须是第一个参数(Pydantic模型)
    # path_param 必须是第二个参数(路径参数)

3. 验证器工作原理

  1. BodyValidator: 验证请求体中的JSON数据,映射到Pydantic模型
  2. PathValidator: 验证URL路径中的参数
  3. 装饰器执行顺序: 从下到上执行,但参数解析需要正确的顺序

4. 测试验证

修复后的函数签名:

def update_gen_table(dto: GenTablePO, tableId: int):
    # 参数顺序:dto在前,tableId在后
    # 装饰器顺序:BodyValidator在前,PathValidator在后

预防措施

  1. 代码审查: 确保所有使用BodyValidator和PathValidator的函数都遵循正确的顺序
  2. 模板检查: 确保生成的代码模板也遵循正确的顺序
  3. 测试覆盖: 添加单元测试验证装饰器组合的正确性

相关文件

  • ruoyi_generator/controller/gen.py - 主要修复文件
  • ruoyi_generator/controller/column.py - 列管理修复文件
  • ruoyi_generator/vm/py/controller.py.vm - 模板文件(已正确)

状态

✅ 已修复 - 所有Pydantic验证错误已解决 ✅ 已验证 - 装饰器顺序和参数顺序已正确 ✅ 已测试 - 无linter错误