Spring MVC中空请求体传入Java Record参数为何不抛异常?
你的猜测完全正确,发送无请求体的POST请求时,Spring MVC确实是通过new LoginParam(null, null)实例化你的Record对象的,不会抛出异常的原因和核心源码逻辑如下:
为什么不会抛出异常
Java Record的全参构造器允许传入null值(你的字段是String类型,本身支持null),而Spring MVC在参数绑定时,若请求中没有对应字段的值,会默认用null填充,再调用Record的全参构造器完成实例化——这个过程完全符合Java语法,因此不会触发异常。
如果希望参数缺失时抛出异常,可以给Record的字段加上Jakarta Validation注解(比如@NotNull),再在控制器方法参数上添加@Valid注解,Spring会自动校验参数非空,触发ConstraintViolationException。
核心源码位置
参数绑定入口:
org.springframework.web.method.annotation.ModelAttributeMethodProcessor
这个类负责处理控制器方法中@ModelAttribute标记的参数(包括默认的请求参数绑定逻辑),它会调用WebDataBinder完成具体的属性绑定。Record专属绑定逻辑:
org.springframework.web.bind.support.WebDataBinder.RecordedValueBinder
这是WebDataBinder的内部类,专门处理Java Record的绑定流程:- 通过反射获取Record的唯一全参构造器
- 遍历构造器的每个参数,尝试从请求中获取对应值(无请求体时返回
null) - 用获取到的参数值(含null)调用构造器,实例化Record对象
值转换辅助:
org.springframework.core.convert.converter.RecordedValueConverter
这个类负责将请求中的值转换为Record构造器所需的参数类型,当没有对应值时,直接返回null供构造器使用。
内容的提问来源于stack exchange,提问作者weng

