使用场景:
使用Spring Boot的@RequestParam注解时,我知道required的默认值是true,理论上来讲,被注解标注的参数如果为null,Spring Boot应该抛出异常。但实际上没有。
问题描述:
public RestObjectResponse<xx> xxx(@RequestParam(value = "role")UserRole role) {
return xxx;
}
从上面的代码来看,如果role为null,应该会直接抛出异常,因此在内部的代码中我就没有校验role是否为null,但事实上null被传进来了。
原因分析:
作为常用的类型,比如Integer、String等,为null会抛出异常。我们这个是枚举类型,遇到这样的问题,我们先思考下面的三个问题
required=true
是判断传入的url参数或body参数为空吗?required=true
是判断最终方法传入被RequestParam修饰的参数对象为空吗?- 是不是对枚举的序列化处理出现了什么问题
先分析枚举序列化
因为我自定义了枚举的序列化,但是在反序列化过程中直接返回的null值。这也应该是造成参数为null的根源。那么通过这个现象我们可以思考,required=true判断的可能仅仅是参数是否为null,当参数不为空,但在反序列化过程中产生的null,是不被检查的。
总结
为了保证required=true 的可信度,在反序列化时,不应该返回null,如果出现不能反序列化的情况,应该抛出异常。