如何让Spring将空字符串请求参数转换为Bean属性的null值,避免对象转换失败?
嗨,这个问题我之前做Spring项目时也踩过坑,咱们一步步来解决你的两个疑问:
一、让Spring把空字符串直接转成null,别瞎折腾对象转换
你遇到的核心问题是:当请求里传了organisationMemberExtension=这种空字符串参数时,Spring会试图把这个空字符串转成OrganisationMember类型,但找不到对应的转换器,直接报错炸了。我们可以用Spring内置的工具轻松解决,优先推荐全局配置(不用每个控制器都写重复代码):
1. 全局配置方式(最省心)
创建一个Spring MVC的配置类,注册StringTrimmerEditor并开启“空字符串转null”的功能:
@Configuration public class WebGlobalConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { // 第二个参数传true,意思是:把空字符串、全空格的字符串都转成null registry.addFormatterForFieldType(String.class, new StringTrimmerEditor(true)); } }
配置好之后,所有请求里的空字符串参数都会被自动换成null,Spring绑定POJO属性时,看到null就直接赋值了,不会再犯傻去转对象,自然就不会报类型转换错误了。
2. 单控制器生效的方式(如果不想全局改)
要是你只想让某个特定的控制器生效,就在那个控制器里加个@InitBinder方法就行:
@InitBinder public void initBinder(WebDataBinder binder) { // 同样设置true,空字符串直接转null binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); }
二、Spring天生就能用嵌套参数构建POJO
你问的第二个问题:能不能通过organisationMemberExtension.id=0&organisationMemberExtension.name=ojdljzd这种参数,让Spring自动构建OrganisationMember对象并赋值给User的属性?必须可以啊!
Spring MVC原生就支持嵌套属性绑定,只要你的OrganisationMember类有公开的无参构造方法,并且有对应属性的getter/setter(就像你代码里写的那样),直接用.分隔嵌套属性的参数名就行。比如你发个这样的请求:
GET /your-edit-endpoint?organisationMemberExtension.id=0&organisationMemberExtension.name=ojdljzd
Spring会自动帮你实例化OrganisationMember,把id和name填进去,再把这个对象塞到User的organisationMemberExtension属性里,啥额外配置都不用加,开箱即用。
小补充
要是你用的是Spring Boot,上面的全局配置类只要加个@Configuration注解就行,Spring会自动扫描到并生效。另外StringTrimmerEditor还会自动修剪字符串两端的空格(比如" "这种全空格的也会转成null),如果业务上需要保留带空格的字符串,那可以自己写个简单的Converter,但大部分场景下默认的修剪行为都是符合需求的。
备注:内容来源于stack exchange,提问作者KDV

