我有两个过程需要在几个领域进行验证。
ProcessA
类,我需要验证几个字段。基于这些字段,我将验证这个类。ProcessB
类,我需要验证不同的字段。如果这些字段有效,那么我将验证这个类。我的两个进程都应该将GenericRecord传递给Validator类,现在取决于它是ProcessA还是ProcessB,我的Validator类应该验证这些字段。
clientId
、deviceId
、payId
。CrossId
、maxId
、minId
。我能够使其适用于ProcessA,但我不知道我的验证程序类对于ProcessB字段验证是什么样子的。混淆的是,当类在构造函数中接收到generirecord时,它如何决定需要验证ProcessA或ProcessB的字段。如果通过了ProcessA,则对ProcessA字段进行验证;如果通过了ProcessB,则对ProcessB字段进行验证。
过程A
try {
GenericRecordDomainDataDecoder decoder = new GenericRecordDomainDataDecoder(config);
while (true) {
ConsumerRecords<byte[], byte[]> records = consumer.poll(1000);
for (ConsumerRecord<byte[], byte[]> record : records) {
GenericRecord payload = decoder.decode(record.value());
String processName = "processA";
// validation logic
Validator validation = new Validator(payload);
if(!validation.isValid())
continue;
// some other code
}
}
} catch (Exception ex) {
// logging error
}
过程B
try {
GenericRecordDomainDataDecoder decoder = new GenericRecordDomainDataDecoder(config);
while (true) {
ConsumerRecords<byte[], byte[]> records = consumer.poll(1000);
for (ConsumerRecord<byte[], byte[]> record : records) {
GenericRecord payload = decoder.decode(record.value());
String processName = "processB";
// validation logic
Validator validation = new Validator(payload);
if(!validation.isValid())
continue;
// some other code
}
}
} catch (Exception ex) {
// logging error
}
下面是我的Validator类,它现在只适用于ProcessA
验证。我添加了另一个构造函数,我知道它不起作用,但只是想显示我想为ProcessB
做什么。然后我需要调用isValid
方法来告诉我ProcessB的字段是否存在。
public class Validator {
private String clientId, deviceId, payId;
// for ProcessA
public Validator(GenericRecord payload) {
clientId = (String) DataUtils.parseRecord(payload, "clientId");
deviceId = (String) DataUtils.parseRecord(payload, "deviceId");
payId = (String) DataUtils.parseRecord(payload, "payId");
}
// for ProcessB, I know this doesn't work - just wanted to show the idea
public Validator(GenericRecord payload) {
crossId = (String) DataUtils.parseRecord(payload, "crossId");
maxId = (String) DataUtils.parseRecord(payload, "maxId");
minId = (String) DataUtils.parseRecord(payload, "minId");
}
// this is what I am calling for ProcessA
public boolean isValid() {
return isValidClientIdDeviceId() && isValidPayId();
}
private boolean isValidPayId() {
if (payId == null) {
logger.log("invalid payId.");
return false;
}
return true;
}
private boolean isValidClientIdDeviceId() {
if (clientId == null && deviceId == null) {
logger.log("invalid clientId and deviceId.");
return false;
}
return true;
}
// getters
}
我可以将另一个参数processName传递给Validator类,它是一个字符串。我们可以用它来实现相应的字段验证吗。
如果您有少数类型的Process类,我向您提出的第一个解决方案是可以接受的。
您可以有一个空的构造函数,并且在构造函数之后调用的进程可以有一个init方法。
只需保留默认构造函数(不需要声明):
public Validator() {
}
// for ProcessA
public initProcessA(GenericRecord payload) {
clientId = (String) DataUtils.parseRecord(payload, "clientId");
deviceId = (String) DataUtils.parseRecord(payload, "deviceId");
payId = (String) DataUtils.parseRecord(payload, "payId");
}
// for ProcessB,
public void initProcessB(GenericRecord payload) {
crossId = (String) DataUtils.parseRecord(payload, "crossId");
maxId = (String) DataUtils.parseRecord(payload, "maxId");
minId = (String) DataUtils.parseRecord(payload, "minId");
}
在流程A中:
Validator validation = new Validator();
validation.initProcessA(payload);
在流程B中:
Validator validation = new Validator();
validation.initProcessB(payload);
第一种解决方案有其局限性<如果您有依赖于流程类的验证特定性,更好的解决方案是为每个流程使用不同的验证器类来分解规则,因为它更易于维护。
例如,您可以:
public abstract class Validator<T extends Process>{
...
// common and abstract methods
...
public abstract boolean isValid();
}
过程A的验证器A:
public class ValidatorA extends Validator<ProcessA>{
...
public ValidatorA(GenericRecord payload){
clientId = (String) DataUtils.parseRecord(payload, "clientId");
deviceId = (String) DataUtils.parseRecord(payload, "deviceId");
payId = (String) DataUtils.parseRecord(payload, "payId");
}
public boolean isValid(){
// validation rules specific to ProcessA
}
...
}
流程B的验证器B:
public class ValidatorB extends Validator<ProcessB>{
...
public ValidatorB(GenericRecord payload) {
crossId = (String) DataUtils.parseRecord(payload, "crossId");
maxId = (String) DataUtils.parseRecord(payload, "maxId");
minId = (String) DataUtils.parseRecord(payload, "minId");
}
public boolean isValid(){
// validation rules specific to ProcessB
}
...
}
根据经验,您永远不应该信任从最终用户收到的数据, 并且应该在充分利用之前对其进行验证。 要给 model 填充其所需的用户输入数据,你可以调用 yii\base\Model::validate() 方法验证它们。该方法会返回一个布尔值,指明是否通过验证。若没有通过,你能通过 yii\base\Model::$errors 属性获取相应的报错信息。比如, $model = new \app\mode
主要内容:输入验证,应用代码,实例解析AngularJS 表单和控件可以验证输入的数据。 输入验证 在前面的几个章节中,你已经学到关于 AngularJS 表单和控件的知识。 AngularJS 表单和控件可以提供验证功能,并对用户输入的非法数据进行警告。 客户端的验证不能确保用户输入数据的安全,所以服务端的数据验证也是必须的。 应用代码 < !DOCTYPE html > < html > < script src= "http:/
有人能帮我完成输入验证功能吗。我正在验证整数输入。问题是当用户输入多个整数my cin时。fail()对每个整数运行,导致我的错误显示多次。让我告诉你我的意思 这是我的代码: 因此,如果用户要输入“jjj”;我的“请只输入整数”显示三次。我只想让它显示一次。我不知道怎么做。有什么想法吗?
如何验证输入,以便当输入为空时弹出消息
本文向大家介绍Dapper.NET 针对多组输入执行操作,包括了Dapper.NET 针对多组输入执行操作的使用技巧和注意事项,需要的朋友参考一下 示例 有时,您想多次做同一件事。Execute如果实际上将最外面的参数(通常是单个匿名类型或域模型实例)提供为IEnumerable序列,则Dapper在方法上支持此方法。例如: 在这里,dapper只是对我们的数据做一个简单的循环,基本上和我们做的一