GeneXus:将BC Transaction暴露为REST服务后批量返回所有验证规则信息
如何让GeneXus REST服务一次性返回所有验证错误信息
默认情况下,GeneXus 将 BC Transaction 暴露为 REST 服务时,会采用「快速失败」模式——遇到第一条验证错误就立即返回响应,不会继续检查后续规则。要实现一次性返回所有验证错误,需要手动替换默认验证逻辑并自定义异常处理:
1. 自定义批量验证逻辑
放弃依赖 GeneXus 自带的属性级空值验证规则,改用手动批量检查并收集错误:
- 先创建一个结构化类型和对应的集合,用于存储多条错误信息:
Structured Type ValidationError Attribute FieldName Type Character(50) // 出错字段名 Attribute Message Type Character(200) // 错误提示信息 EndType Collection Type ValidationErrorCollection Of ValidationError - 在 Transaction 的
BeforeSave事件中,逐个检查所有需要验证的属性,将错误逐条加入集合:Event BeforeSave &ValidationErrors = New() // 检查客户ID是否为空 If &CustomerId.IsEmpty() &NewError = New() &NewError.FieldName = "CustomerId" &NewError.Message = "客户ID不能为空" &ValidationErrors.Add(&NewError) EndIf // 检查客户名称是否为空 If &CustomerName.IsEmpty() &NewError = New() &NewError.FieldName = "CustomerName" &NewError.Message = "客户名称不能为空" &ValidationErrors.Add(&NewError) EndIf // 可继续添加其他属性的验证逻辑... // 若存在错误,抛出带错误集合的自定义异常 If &ValidationErrors.Count > 0 Throw Exception(&ValidationErrors, "ValidationFailed") EndIf EndEvent
2. 自定义REST异常处理器
默认的异常处理器只会返回单条错误,需要自定义处理器来捕获上述自定义异常并返回完整错误集合:
- 创建异常处理类,实现对
ValidationFailed异常的解析和响应构建:Class RESTExceptionHandler Public Function HandleException(&Exception As Exception) As HttpResponse &HttpResponse = New() // 捕获自定义验证异常 If &Exception.Id = "ValidationFailed" &HttpResponse.StatusCode = 400 // 标记为请求错误 &HttpResponse.Body = Serialize(&Exception.Data) // 序列化错误集合为JSON &HttpResponse.ContentType = "application/json" Else // 其他异常沿用默认处理逻辑 &HttpResponse = DefaultExceptionHandler.HandleException(&Exception) EndIf Return &HttpResponse EndFunction EndClass - 将该处理器绑定到REST服务:在REST服务的属性设置中,找到「Exception Handler」选项,指定为
RESTExceptionHandler。
版本兼容性说明
该方案在 GX16、GX17、GX18 版本中均适用,因为这些版本已支持结构化类型、集合序列化以及自定义REST异常处理器的配置。
内容的提问来源于stack exchange,提问作者DeivisKC_Solution
相关产品推荐
相关产品推荐

