Java和C#下的参数验证

参数的输入和验证问题是开发时经常遇到的,一般的验证方法如下:

public bool Register(string name, int age)
{
    if (string.IsNullOrEmpty(name))
    {
        throw new ArgumentException("name should not be empty", "name");
    }
    if (age < 10 || age > 70)
    {
        throw new ArgumentException("the age must between 10 and 70","age");
    }
    //...
}

这样做当需求变动的时候,要改动的代码相应的也比较多,这样比较麻烦,最近接触到了Java和C#下2种方便的参数验证方法,简单的介绍下。

Java参数验证:

采用google的guava下的一个辅助类:

import com.google.common.base.Preconditions;

示例代码:

    public static void checkPersonInfo(int age, String name){
        Preconditions.checkNotNull(name, "name为null");
        Preconditions.checkArgument(name.length() > 0, "name的长度要大于0");
        Preconditions.checkArgument(age > 0, "age必须大于0");
        System.out.println("a person age: " + age + ", name: " + name);
    }

    public static void getPostCode(String code){
        Preconditions.checkArgument(checkPostCode(code),"邮政编码不符合要求");
        System.out.println(code);
    }

    public static void main(String[] args) {
        try {
            checkPersonInfo(10,"fdsfsd");
            checkPersonInfo(10,null);
            checkPersonInfo(-10,"fdsfsd");
            getPostCode("012234");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

当参数不满足要求的时候,抛出异常信息,异常中携带的信息为后面自定义的字符串,这样写就方便多了。

C#参数验证:

采用FluentValidation这个类库,参考地址在下面。

使用方法:

一个简单的Person类:

    public class Person
    {
        public string Name { set; get; }

        public int Age { set; get; }

        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }

Person的验证类:

    public class PersonValidator : AbstractValidator<Person>
    {
        public PersonValidator()
        {
            RuleFor(x => x.Name).NotEmpty().WithMessage("姓名不能为空");
            RuleFor(x => x.Name).Length(1,50).WithMessage("姓名字符不能超过50");
            RuleFor(x => x.Age).GreaterThan(0).WithMessage("年龄必须要大于0");
        }

        private bool ValidName(string name)
        {
            // custom name validating logic goes here
            return true;
        }
    }

使用:

    class Program
    {
        static void Main(string[] args)
        {
            Person customer = new Person(null,-10);
            PersonValidator validator = new PersonValidator();
            ValidationResult results = validator.Validate(customer);

            bool validationSucceeded = results.IsValid;
            IList<ValidationFailure> failures = results.Errors;
            foreach (var failure in failures)
            {
                Console.WriteLine(failure.ErrorMessage);
            }

            Console.ReadKey();
        }
    }

FluentValidation的使用文档:http://fluentvalidation.codeplex.com/documentation

参考资料:

http://fluentvalidation.codeplex.com/

https://github.com/JeremySkinner/FluentValidation

时间: 2024-08-05 16:22:50

Java和C#下的参数验证的相关文章

C# 中参数验证方式的演变

一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限制,如果是整数可能需要判断范围,如果是一些特殊的类型比如电话号码,邮件地址等,可能需要使用正则表达式进行判断. 通常,我们一般都是在方法开始的地方进行条件判断,然后抛出合适的异常,这是最普通和通用的做法,但是在.NET中,利用一些语言特性和类库,可以使用一些其他的方式将我们从复杂繁琐的工作中解放出来

淘宝SOA框架dubbo学习(4)--参数验证

1.由于没用maven,和对dubbo不是很了解的原因,这次,总因为jar包不对,而导致:dubbo客户端程序,启动不起来 所以决定:将原来用过的所有jar包全部去,将dubbo-demo-provider-2.5.4-SNAPSHOT/lib下的所有jar包全部导入项目中 一切就OK了 2.服务消费者代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

ASP.NET WebAPI 11 参数验证

在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性. ModelState 在ApiController中一个ModelState属性用来获取参数验证结果. public abstract class ApiController : IHttpController, IDisposable { public ModelStateDictionary ModelState { get; } } ApiContext的ModelState属性实

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

基于Java Bean Validation对Request参数进行校验的设计思路

摘自Hibernate Validator文档: 数据校验是任何一个应用程序都会用到的功能,无论是显示层还是持久层. 通常,相同的校验逻辑会分散在各个层中, 这样,不仅浪费了时间还会导致重复代码的发生. 为了避免重复, 开发人员经常会把这些校验逻辑直接写在领域模型里面, 但是这样又把领域模型代码和校验代码混杂在了一起, 而这些校验逻辑更应该是描述领域模型的元数据. JSR 303 - Bean Validation (version 1.1)- 为实体验证定义了元数据模型和API. 默认的元数据

java多环境下的配置

在项目开发过程中经常会有开发环境.测试环境.生产环境等,这些环境下的配置文件又各不相同.如何在不同环境下使用不同的配置是一个有意思的问题 常用的做法有 1.使用jndi通过tomcat不同的配置,这个需要在每一个tomcat下都进行配置,最恶心的是在eclipse下tomcat插件无法读取到jndi的信息. 2.还是通过配置tomcat的参数,读取不同环境下的配置,这种情况也有问题,eclipse下的tomcat插件也无法读取到,因为开发环境才会用到tomcat插件,所以读取不到可以默认为开发环

java从基础知识(十)java多线程(下)

首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 每个线程都有自己的工作内存,存有主内存中共享变量的副本,当工作内存中的共享变量改变,会主动刷新到主内存中,其它工作内存要使用共享变量时先从主内存中刷新共享变量到工作内存,这样就保证了共享变量的可见性. 可

不要在linux上使用java 7 Files的接口参数StandardOpenOption.DELETE_ON_CLOSE

最近在看安全代码规范建议中提到关于如何删除创建的临时文件,推荐使用jdk7中的Files的函数,通过参数StandardOpenOption.DELETE_ON_CLOSE来控制 代码示例 BufferedWriter writer = Files.newBufferedWriter(tempFile, Charset.forName("UTF8"), StandardOpenOption.DELETE_ON_CLOSE) 只要当文件close掉,这个文件就会自动被系统删除,这样可以避

采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址

采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址. Truelicense 它是一个开源java license 检验项目. 使用truelicense实现用于JAVAprojectlicense机制(包含license生成和验证)请參考http://www.it165.net/pro/html/201404/11540.html 当中包含license授权机制的原理和制作license的详细步骤 本文主要是