首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

优雅的参数校验与全局异常-代码规范的天生落地

全局异常+自定义异常+参数校验+统一返回体组合是互联网中Java开发规范、使用代码扫描工具后的提升效率的必然落地方式。...针对开发规范的细节考量,本文主要描述业界常用的基于@Valid和@Validated的前置校验,结合全局异常与Http Code,帮助读者理解高效且优雅的参数校验,及通用场景下的全局异常机制。...后文将解释全局异常的出现是如何克服该问题。 # 全局异常捕获 # 为什么用Http Code 本文的全局异常与Http Code、自定义异常紧密结合。...加入全局异常后,我们再次请求参数校验时的例子,可以发现参数不正确时的异常包装,与控制台的唯一请求日志 ? ? 此时的消息为校验实体注解上所编写的消息。...# 自定义异常 在全局异常捕获了参数校验异常后,我们就可以省去关于Http请求的代码校验,仅需要使用注解即可自动包装返回体和提示语给前端。

2.5K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    WPF 类型的构造函数执行符合指定的绑定约束的调用时引发了异常

    本文告诉大家如果遇到类型“Foo.MainWindow”的构造函数执行符合指定的绑定约束的调用时引发了异常的时候可以如何知道是哪个不清真代码 在 WPF 开发中,如果遇到类型的构造函数执行符合指定的绑定约束的调用时引发了异常...CelakercalbochallhiNerjufeeqalchelfu.App.Main() 但是此时应该可以找到一些内部异常 很经常可以看到的内部异常有两个 “Foo.MainWindow”的类型初始值设定项引发异常...如果看到是这两个异常,那么请找到默认值类型与属性“Lindexi”类型不匹配里面说到的属性名对应的定义的代码,一般这个属性是依赖属性或附加属性 如我就逗比写了这段代码 public static...,需要在 PropertyMetadata 传入的默认参数的类和定义的 typeof(string) 是相同的类,如上面代码定义的是字符串,但是在默认值设置的是整数,于是这里就不能转换了。...注意,即使隐式转换也是不可以的,如定义的是浮点但是传入整数也是不可以的 解决方法是修改默认值或修改定义的类就可以了 那么为什么在这里定义不对会直接告诉小伙伴是在构造函数绑定的时候炸了?

    4.7K20

    WPF 类型的构造函数执行符合指定的绑定约束的调用时引发了异常

    本文告诉大家如果遇到类型“Foo.MainWindow”的构造函数执行符合指定的绑定约束的调用时引发了异常的时候可以如何知道是哪个不清真代码 在 WPF 开发中,如果遇到类型的构造函数执行符合指定的绑定约束的调用时引发了异常...CelakercalbochallhiNerjufeeqalchelfu.App.Main() 但是此时应该可以找到一些内部异常 很经常可以看到的内部异常有两个 “Foo.MainWindow”的类型初始值设定项引发异常...如果看到是这两个异常,那么请找到默认值类型与属性“Lindexi”类型不匹配里面说到的属性名对应的定义的代码,一般这个属性是依赖属性或附加属性 如我就逗比写了这段代码 public static...,需要在 PropertyMetadata 传入的默认参数的类和定义的 typeof(string) 是相同的类,如上面代码定义的是字符串,但是在默认值设置的是整数,于是这里就不能转换了。...注意,即使隐式转换也是不可以的,如定义的是浮点但是传入整数也是不可以的 解决方法是修改默认值或修改定义的类就可以了 那么为什么在这里定义不对会直接告诉小伙伴是在构造函数绑定的时候炸了?

    2.2K20

    可以迭代大部分数据类型的 for…of 为什么不能遍历普通对象?

    for...of 允许你遍历 Array(数组), String(字符串), Map(映射), Set(集合),TypedArray(类型化数组)、arguments、NodeList对象、Generator...value] of Object.entries(obj)){ console.log(value) // value1, value2 } // 方法二:Map // 普通对象转Map // Map 可以接受一个数组作为参数...简单来说,ES6 为了统一集合类型数据结构的处理,增加了 iterator 接口,供 for...of 使用,简化了不同结构数据的处理。...; yield*:_yield*后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口; 由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用; 字符串是一个类似数组的对象,也原生具有...当然,下面的代码只是最简单的示例,你可以在此基础上探究更多实用的技巧。

    1.2K30

    UWP WinUI3 传入 AddHandler 的 RoutedEventHandler 类型与事件所需不匹配将抛出参数异常

    本文记录一个 UWP 或 WinUI3 的开发过程中的问题,当开发者调用 AddHandler 时,所需的 Handler 参数类型为 RoutedEventHandler 类型,然而实际上正确类型是需要与所监听事件匹配才能符合预期工作...,否则将抛出缺乏信息的参数异常 开始之前先惯例吐槽一下,我从 2015 开始开发 UWP 应用,然而到 2024 的时候,依然没有看到开发体验上的优化。...原因是 AddHandler 里面的 Handler 参数就是 object 类型的。...然而在运行中将会抛出参数异常,异常信息如下 System.ArgumentException: Value does not fall within the expected range....通过查阅文档或者是在 VisualStudio 里面点点看,就可以看到对应的事件的定义,如下面代码就是 PointerPressed 的定义,可以看到事件是 PointerEventHandler 类型的委托

    19310

    根据java编译器规则在Class中搜索匹配指定参数类型表的泛型方法(GenericMethod)

    因为项目的需要,设计了一个满足特定需要的代码自动生成工具。在开发过程中需要根据方法名和方法参数类型数组在指定的类中根据java编译器的规则找到与之最匹配的泛型方法。...,发现java编译器在匹配泛型方法时,对参数的匹配是遵循从左到右的顺序来一个个检查的,根据这个规则写了下面的方法来实现泛型方法的精确匹配。.../** * @param clazz 要搜索的类 * @param name 方法名 * @param parameterTypes 希望匹配的参数类型数组 *...throw new IllegalStateException("found more matched method"); } } //没有找到匹配的方法就抛出异常...,可能会出现返回并不匹配方法的结果,不过在我的应用场景中有别的措施做了保证,所以不会有问题,你可以根据自己需要再补充一些检查代码。

    1.6K30

    为什么说python里面函数参数的默认值最好不要使用可变类型

    之前发布过Python中函数的介绍:Python中函数的介绍 ,今天来做一个小小的补充说明:为什么说python里面函数参数的默认值最好不要使用可变类型 Python中,函数参数的默认值是在函数定义时计算的...当默认值是可变类型(如列表、字典等)时,这个默认值在函数定义时就会被创建并分配给参数。当函数被调用时,如果没有显式地传递该参数,函数将使用该默认值。...可变类型的默认值在函数定义时只会被创建一次,然后会在后续函数调用中重复使用。这意味着,如果在函数中修改了这个默认值,它将在后续的函数调用中保持修改后的值,而不是返回最初的默认值。...接下来我们通过一个例子演示一下: def add(a:int,b:list=[]): # 定义函数的时候就创建了列表 print(id(b)) b.append(a) print...(b) add(1) add(2) add(3) 从上面的运行结果,我们可以看出: 如果在函数的定义中,参数默认值使用可变类型,那么可变类型会在函数定义的时候就进行创建,如果使用不当的话,可能得到的效果与我们的预期不一致

    19230

    为什么ASP.NET Core的路由处理器可以使用一个任意类型的Delegate

    二、参数绑定 既然可以将一个任意类型的委托终结点的处理器,意味着路由系统在执行委托的时候能够自行绑定其输入参数。这里采用的参数绑定策略与ASP.NET MVC的“模型绑定”如出一辙。...当定义某个用来处理请求的方法时,我们可以在输入参数上标注一些特性显式指定绑定数据的来源,这些特性大都实现了如下这些接口。...TryParse的静态方法将指定的字符串表达式转换成当前类型的实例,路由系统在对该类型的参数进行绑定的时候会优先从路由参数和查询字符串中提取相应的内容,并通过调用这个方法生成绑定的参数。...注册的终结点处理器委托以该类型为参数,指定的参数名称为“foobar”。我们在发送的请求中以查询字符串的形式提供对应的表达式“(123,456)”,从返回的内容可以看出参数得到了成功绑定。...按照约定,这个BindAsync应该定义成返回类型为ValueTask的静态方法,它可以拥有一个类型为HttpContext的参数,也可以额外提供一个ParameterInfo类型的参数,这两个参数分别与当前

    15610

    数据挖掘引论篇学习笔记为什么进行数据挖掘可以挖掘什么样的数据可以挖掘什么类型的模式使用的技术面向什么类型的应用数据挖掘面临的问题

    先从概念上了解数据挖掘 为什么进行数据挖掘 我们生活在大量数据日积月累的年代。分析这些数据是一种重要需求。...数据挖掘能把大型数据转化成知识 数据挖掘是信息数据的进化 可以挖掘什么样的数据 数据库数据 关系数据库是表的汇集,表中通常有大量关系数据 数据仓库数据 数据仓库是从一个或者多个数据源收集的信息存储库,...存放在一致的模式下,并且通常驻留在单个站点 事务数据 事务数据库的一个记录代表一个事务,比如顾客的一次购物 其他类型数据 比如多媒体数据等等......可以挖掘什么类型的模式 特征化与区分 数据特征化 目标类数据的一般或者全部汇总,特征化的输出一般使用饼图、条形图、曲线图等等,比如汇总一年花费5000元以上的用户 数据区分 将数据对象的一般特征进行比较...数据挖掘面临的问题 1、挖掘方法 2、用户交互 3、有效性与可伸缩性 4、数据类型的多样性 5、数据挖掘与社会

    81560

    未经处理的异常在 System.Data.dll 中发生。其他信息:在应使用条件的上下文(在 ‘***‘ 附近)中指定了非布尔类型的表达式。

    在机房收费系统的“联合查询”模块中出现的问题:“System.Data.SqlClient.SqlException”类型的未经处理的异常在 System.Data.dll 中发生。...其他信息: 在应使用条件的上下文(在 '@strCondition' 附近)中指定了非布尔类型的表达式。          ...经过一阵冥思苦想,在数据库中尝试了好多次后,才明白这到底是为什么。。。。          ...(2)、查询语句中where与1之间有空格,报错:在应使用条件的上下文(在 '1' 附近)中指定了非布尔类型的表达式;          2、假设查询语句中where后面是一条语句时(假设这条语句是“...【画龙点睛】        在where后面,如果仅仅是一个Boolean类型的值或者Boolean类型的变量,那么where和这个Boolean值之间是不可以有空格的(这时,我的代码中的@strCondition

    80450

    未经处理的异常在 System.Data.dll 中发生。其他信息:在应使用条件的上下文(在 *** 附近)中指定了非布尔类型的表达式。

    在机房收费系统的“联合查询”模块中出现的问题:“System.Data.SqlClient.SqlException”类型的未经处理的异常在 System.Data.dll 中发生。...其他信息: 在应使用条件的上下文(在 '@strCondition' 附近)中指定了非布尔类型的表达式。          ...经过一阵冥思苦想,在数据库中尝试了好多次后,才明白这到底是为什么。。。。          ...(2)、查询语句中where与1之间有空格,报错:在应使用条件的上下文(在 '1' 附近)中指定了非布尔类型的表达式; ?          ...【画龙点睛】        在where后面,如果仅仅是一个Boolean类型的值或者Boolean类型的变量,那么where和这个Boolean值之间是不可以有空格的(这时,我的代码中的@strCondition

    1.5K20

    @AutoWired和@Resource的区别

    @Resource: 这是Java EE 5的注解,由JSR-250规范定义,也被Spring框架支持,用于实现JNDI查找和自动装配。...如果没有明确指定名称,Spring将抛出异常。指定名字用的注解就是@Qualifier@Resource: 默认的注入顺序是按照Bean的名称进行匹配,如果找不到,则会按照类型进行匹配。...如果仍然找不到,将不会抛出异常,而是返回null。支持的参数@Autowired: 支持多种参数,包括required(是否必须)和primary(是否首选)等。...@Resource: 支持name属性,可以通过它指定要注入的Bean的名称。也支持type属性。可以根据类型查找对应的bean。...使用@Resource可以提高代码的兼容性,特别是在需要与Java EE环境交互时。@Autowired如果找不到匹配的Bean,会抛出一个异常,除非它使用了optional=true参数。

    73210

    终于搞懂,为什么 Java 的 main 方法必须是 public static void?

    Main 方法必须严格遵循它的语法规则,方法签名必须是 public static void,参数是字符串数组类型,如果是 Java1.5 及以后的版本还可以使用可变参数: public static...Java 指定了一些可访问的修饰符如:private、protected、public,任何方法或变量都可以声明为 public,Java 可以从该类之外的地方访问。...6.你可以声明 main 方法使用 java1.5 的可变参数的方式如:publicstaticvoid main(String... args)。...8.main 方法在 Java 可以像其他方法一样被重载,但是 JVM 只会调用上面这种签名规范的 main 方法。...9.你可以使用 throws 子句在方法签名中,可以抛出任何 checked 和 unchecked 异常。

    70810

    求求你别在用IF ELSE校验参数了

    2.为什么使用Hibernate Validator 提高代码整洁度; 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度; 统一且规范的验证方式,无需你再次编写重复的验证代码; 你将更专注于你的业务,...,值必须大于等于指定的value值 @Max(value) 被注释的元素可以是字符串、数值类型,如果元素是字符串类型,将值转为BigDecimal类型,并与value属性进行比对,值必须小于等于指定的value...值 @DecimalMin(value) 被注释的元素可以是字符串、数值(可以带小数点),将注解内value的值转为BigDecimal类型,必须大于等于指定的最小值(可以配置是否等于value,默认是包含的...) @DecimalMax(value) 被注释的元素可以是字符串、数值(可以带小数点),将注解内value的值转为BigDecimal类型,其值必须小于等于指定的最大值(可以配置是否等于value,默认是包含的...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上

    1.7K20

    求求你别在用IF ELSE校验参数了

    2.为什么使用Hibernate Validator 提高代码整洁度; 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度; 统一且规范的验证方式,无需你再次编写重复的验证代码; 你将更专注于你的业务,...,值必须大于等于指定的value值 @Max(value) 被注释的元素可以是字符串、数值类型,如果元素是字符串类型,将值转为BigDecimal类型,并与value属性进行比对,值必须小于等于指定的value...值 @DecimalMin(value) 被注释的元素可以是字符串、数值(可以带小数点),将注解内value的值转为BigDecimal类型,必须大于等于指定的最小值(可以配置是否等于value,默认是包含的...) @DecimalMax(value) 被注释的元素可以是字符串、数值(可以带小数点),将注解内value的值转为BigDecimal类型,其值必须小于等于指定的最大值(可以配置是否等于value,默认是包含的...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上

    1.9K10

    求求你别在用IF ELSE校验参数了

    2.为什么使用Hibernate Validator 提高代码整洁度; 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度; 统一且规范的验证方式,无需你再次编写重复的验证代码; 你将更专注于你的业务,...,值必须大于等于指定的value值 @Max(value) 被注释的元素可以是字符串、数值类型,如果元素是字符串类型,将值转为BigDecimal类型,并与value属性进行比对,值必须小于等于指定的value...值 @DecimalMin(value) 被注释的元素可以是字符串、数值(可以带小数点),将注解内value的值转为BigDecimal类型,必须大于等于指定的最小值(可以配置是否等于value,默认是包含的...) @DecimalMax(value) 被注释的元素可以是字符串、数值(可以带小数点),将注解内value的值转为BigDecimal类型,其值必须小于等于指定的最大值(可以配置是否等于value,默认是包含的...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上

    1.8K20

    Validator,就来这一篇吧

    2.为什么使用Hibernate Validator 提高代码整洁度; 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度; 统一且规范的验证方式,无需你再次编写重复的验证代码; 你将更专注于你的业务,...,值必须大于等于指定的value值 @Max(value) 被注释的元素可以是字符串、数值类型,如果元素是字符串类型,将值转为BigDecimal类型,并与value属性进行比对,值必须小于等于指定的value...值 @DecimalMin(value) 被注释的元素可以是字符串、数值(可以带小数点),将注解内value的值转为BigDecimal类型,必须大于等于指定的最小值(可以配置是否等于value,默认是包含的...) @DecimalMax(value) 被注释的元素可以是字符串、数值(可以带小数点),将注解内value的值转为BigDecimal类型,其值必须小于等于指定的最大值(可以配置是否等于value,默认是包含的...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上

    2.7K10

    【问答】JVM哪些区域会触发OOM?实践检验一下

    虚拟机栈异常 Java 虚拟机规范规定了栈是有深度的,当栈深度超过了指定大小后会抛出 StackOverflowError。为什么 Java 虚拟机要规定栈的深度呢?...,作者暂时还没搞清楚是为什么): 「配置 -Xss160k 参数」 指定栈容量大小后,栈溢出情况如下图: 「配置 -Xss128k」 如果指定栈内存小于 160k 会报如下图所示错误,即 JVM 的内存大小是有限制的...Java 堆的大小我们可以通过 -Xmx 和 -Xms 两个参数来控制,其中 -Xms 参数指定了堆内存的最小值, -Xmx 指定了当堆内存不够时,可以扩展到最大 -Xmx 指定大小的内存。...Java 虚拟机规范规定当扩展到 -Xmx 时指定的容量时,还没有足够的内存去容纳新产生的对象时,就会触发 OutOfMemoryError 的异常。...如果指定 -Xmx 值小于 -Xms 时,程序会在初始化时直接抛出如下图异常: 方法区 用于存放已经被虚拟机加载的类型信息、常量、静态变量等等信息。

    1.2K20
    领券