Non-Field Validator Vs Field-Validator--字段校验和非字段校验

本文详细介绍了Struts2框架中两种校验器的使用方法:非字段校验器和字段校验器。非字段校验器适用于不特定字段的情况,而字段校验器专门用于指定字段的校验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:http://struts.apache.org/2.2.1/docs/validation.html



There are two ways you can define validators in your -validation.xml file:

  1. <validator>
  2. <field-validator>

Keep the following in mind when using either syntax:

Non-Field-Validator: The <validator> element allows you to declare both types of validators (either a plain Validator a field-specific FieldValidator).

 

 

fiel d -validator : The <field-validator> elements are basically the same as the <validator> elements except that they inherit the fieldName attribute from the enclosing <field> element. FieldValidators defined within a <field-validator> element will have their fieldName automatically filled with the value of the parent <field> element's fieldName attribute. The reason for this structure is to conveniently group the validators for a particular field under one element, otherwise the fieldName attribute would have to be repeated, over and over, for each individual <validator>.

It is always better to defined field-validator inside a <field> tag instead of using a <validator> tag and supplying fieldName as its param as the xml code itself is clearer (grouping of field is clearer)
Note that you should only use FieldValidators (not plain Validators) within a block. A plain Validator inside a <field> will not be allowed and would generate error when parsing the xml, as it is not allowed in the defined dtd (xwork-validator-1.0.2.dtd)

Declaring a FieldValidator using the <field-validator> syntax





The choice is yours. It's perfectly legal to only use elements without the elements and set the fieldName attribute for each of them. The following are effectively equal:

 



译文:


                                       

非字段校验器vs字段校验器

这里有两种方法在你的-validation.xml文件里定义校验器
1.<validator>
2.<field-validator>

当你使用这两种方法时请将下面的禁忌于心。

非字段校验器:你可以使用<validator>标签定义两种类型的校验器(抽象出来的校验器或具体字段的校验器)





字段校验器:<field-validator>和<validator>只有一点不同, 那就是<field-validator>的
fieldName属性继承自他的父标签<field>标签。<field>标签通过制定name属性为他的子标签
绑定该指定字段,如:<field name="email_address"> 。采用这种结构的好处,很容易
把针对某一个字段的校验器集合到一个校验器组,否则的话你每个<validator>标签都要写一个
name属性,我的天啊。

在<field>标签下定义<field-validator>标签比在每一个<validator>标签下定义fieldname
参数更清晰。(字段组更清晰)

注意:你只能在field标签里面定义<field-validator>元素,而不能定义抽象的<validator>
元素。如果你在<field>标签里面定义<validator>将导致错误,因为这在 xwork-validator-1.0.2.dtd
是不允许的

在定义 字段校验器时请遵循以下语法规则:

你可以选择之一。你使用非字段校验,并且每一次都为他设定fieldname属性是完全合法的。
下面两种方式是一样的。





 

 

 


 

 

字段校验器:

    一个<field>绑定一个字段,一个<field>可以有多个<field-validator>,对一个字段可以有多个校验。

    结构清晰,方便浏览和检查。易于维护。


非字段校验器:

   一个<validator>标签下面只能对一个字段进行校验,如果对一个字段进行多次校验,需要写很多个<validator>,很繁琐。而且不利于维护。

 

 

 

 

 


 

by loverszhaokai



C:\Users\lanpe>labelme Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "D:\Anaconda\Scripts\labelme.exe\__main__.py", line 4, in <module> File "D:\Anaconda\Lib\site-packages\labelme\__main__.py", line 15, in <module> from labelme.app import MainWindow File "D:\Anaconda\Lib\site-packages\labelme\app.py", line 21, in <module> from labelme._automation import bbox_from_text File "D:\Anaconda\Lib\site-packages\labelme\_automation\bbox_from_text.py", line 6, in <module> import osam File "D:\Anaconda\Lib\site-packages\osam\__init__.py", line 5, in <module> from . import apis # noqa: F401 ^^^^^^^^^^^^^^^^^^ File "D:\Anaconda\Lib\site-packages\osam\apis.py", line 7, in <module> from . import _models File "D:\Anaconda\Lib\site-packages\osam\_models\__init__.py", line 1, in <module> from .efficientsam import EfficientSam10m # noqa: F401 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Anaconda\Lib\site-packages\osam\_models\efficientsam\__init__.py", line 1, in <module> from ._models import EfficientSam10m # noqa: F401 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Anaconda\Lib\site-packages\osam\_models\efficientsam\_models.py", line 4, in <module> from osam import types File "D:\Anaconda\Lib\site-packages\osam\types\__init__.py", line 3, in <module> from ._annotation import Annotation # noqa: F401 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Anaconda\Lib\site-packages\osam\types\_annotation.py", line 10, in <module> class Annotation(pydantic.BaseModel): File "D:\Anaconda\Lib\site-packages\osam\types\_annotation.py", line 18, in Annotation @pydantic.field_validator("mask") ^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: module 'pydantic' has no attribute 'field_validator'. Did you mean: 'root_validator'?
05-13
### 解决 Python 中使用 Labelme 时因 Pydantic 模块导致的 `AttributeError` 问题 在处理 `Labelme` 工具的过程中,可能会遇到由于 `Pydantic` 模块升级而引发的兼容性问题。具体表现为尝试运行程序时报错 `AttributeError`,这通常是因为某些函数或装饰器名称发生了变更所致。 #### 更新后的 Pydantic 版本变化 自 `Pydantic V2.x` 开始,许多 API 和功能都进行了重构。其中一个重要更改就是原用于定义字段校验器的 `@validator` 方法已被废弃,并替换成了更灵活的新机制——即 `@field_validator` 装饰器[^1]。然而需要注意的是,这种改变仅适用于新版库;如果你所依赖的应用仍基于旧版设计模式编写的话,则继续沿用原来的写法会更加稳妥一些。 对于像 `osam.Annotation Class` 这样可能涉及到复杂数据结构验证场景下的应用来说尤其如此。当我们在 Windows 平台下利用 Anaconda 创建虚拟环境并安装最新版本包之后再执行相关脚本文件时就极有可能触发此类错误提示信息:“module 'pydantic' has no attribute 'field_validator'”。 #### 处理方案一:降级至稳定的老版本 Pydantic 最直接的办法便是重新调整我们的开发环境中关于此第三方扩展库的具体选用标准回到那些已经被证明具有良好适配性的历史发行版本上去。比如我们可以先查看当前系统里预装了哪个级别的实例化对象管理框架组件: ```bash pip show pydantic ``` 然后依据实际情况采取相应措施将其锁定在一个相对固定的范围内(如v1系列),从而避免不必要的麻烦发生: ```bash pip install --upgrade "pydantic<2" ``` #### 方案二:修改源码适应新API风格 另一种更为长远但也更具风险的选择则是深入研究目标应用程序内部实现细节进而针对性地对其进行改造优化使其能够无缝衔接上现代化的标准接口规范要求。以官方文档为例展示如何正确运用新的验证逻辑构造一个简单的模型类: ```python from pydantic import BaseModel, field_validator class Model(BaseModel): a: str @field_validator('a') def check_a(cls, value): if not isinstance(value,str) or len(value.strip())<=0 : raise ValueError("Field A must be non-empty string.") return value.upper() m=Model(a="hello world") print(m.json()) ``` 以上代码展示了如何通过 `@field_validator` 对输入参数进行基本类型的检查以及进一步业务规则上的限定操作[^1]。但是考虑到实际工程项目规模庞大且维护成本高昂等因素影响,在没有特别必要的情况下一般不推荐轻易改动既有资产内容。 --- ### 总结 综上所述,针对目前面临的情况可以从两个方向出发寻找合适的解决方案:一是适当回滚软件栈构成要素直至找到最佳平衡点为止;二是积极探索学习新兴技术趋势努力提升自我能力水平不断追求进步成长之路。无论最终选择了哪条路径前进都需要保持足够的耐心细致态度认真对待每一个环节步骤才能取得理想效果达成预期目的。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值