当前位置: 首页 > 知识库问答 >
问题:

验证输入并相应地执行操作

嵇光临
2023-03-14

我有两个过程需要在几个领域进行验证。

  • 对于ProcessA类,我需要验证几个字段。基于这些字段,我将验证这个类。
  • 对于ProcessB类,我需要验证不同的字段。如果这些字段有效,那么我将验证这个类。

我的两个进程都应该将GenericRecord传递给Validator类,现在取决于它是ProcessA还是ProcessB,我的Validator类应该验证这些字段。

  • 对于ProcessA,我需要验证clientIddeviceIdpayId
  • 对于ProcessB,我需要验证CrossIdmaxIdminId

我能够使其适用于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类,它是一个字符串。我们可以用它来实现相应的字段验证吗。

共有1个答案

伯向晨
2023-03-14

如果您有少数类型的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只是对我们的数据做一个简单的循环,基本上和我们做的一