SpringMVC空字符串转为null

空字符串转为null

现在我遇到这样一个需求,那就是我想要吧前端传过来的值变为空,因为所谓前端的校验,其实都不是校验,如果前端传给后台一个表单,可是表单未填入值,我们后台进行判断的时候 既需要判断null,同时需要判断是否为"", 并且如果你不希望数据库插入的是空字符串,而是null,那么转换和插入的就很麻烦

if (manager.getUsername().equals("") || manager.getUsername() == null) {
            throw new ErrorException("用户名未填写");
        }
        if (manager.getPassword().equals("") || manager.getPassword() == null) {
            throw new ErrorException("密码未填写");
        }

可是如果你在SpringMVC进行参数赋值处理之前就能把""转换为null,那么你就只需要进行如下判断,并且插入数据库的一直是空值

if (manager.getUsername() == null) {
            throw new ErrorException("用户名未填写");
        }
        if (manager.getPassword() == null) {
            throw new ErrorException("密码未填写");
        }

实现方式

  1. 可以使用过滤器/拦截器把空字符串设置成null(未尝试)
  2. 注册一个SpringMVC HandlerAdapter来进行处理

使用SpringMVC时,所有的请求都是最先经过DispatcherServlet的,然后由DispatcherServlet选择合适的HandlerMapping和HandlerAdapter来处理请求,HandlerMapping的作用就是找到请求所对应的方法,而HandlerAdapter则来处理和请求相关的的各种事情。我们这里要讲的请求参数绑定也是HandlerAdapter来做的。

参数处理器

我们需要写一个自定义的请求参数处理器,然后把这个处理器放到HandlerAdapter中,这样我们的处理器就可以被拿来处理请求了。

public class EmptyStringToNullModelAttributeMethodProcessor extends ServletModelAttributeMethodProcessor implements ApplicationContextAware {

    ApplicationContext applicationContext;

    public EmptyStringToNullModelAttributeMethodProcessor(boolean annotationNotRequired) {
        super(annotationNotRequired);
    }

    @Override
    protected void bindRequestParameters(WebDataBinder binder, NativeWebRequest request) {
        EmptyStringToNullRequestDataBinder toNullRequestDataBinderBinder = new EmptyStringToNullRequestDataBinder(binder.getTarget(), binder.getObjectName());
        RequestMappingHandlerAdapter requestMappingHandlerAdapter = applicationContext.getBean(RequestMappingHandlerAdapter.class);
        requestMappingHandlerAdapter.getWebBindingInitializer().initBinder(toNullRequestDataBinderBinder, request);
        toNullRequestDataBinderBinder.bind(request.getNativeRequest(ServletRequest.class));
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

DataBinder

继承自ExtendedServletRequestDataBinder,主要用来自定义数据绑定处理

public class EmptyStringToNullRequestDataBinder extends ExtendedServletRequestDataBinder {
    public EmptyStringToNullRequestDataBinder(Object target, String objectName) {
        super(target, objectName);
    }

    protected void addBindValues(MutablePropertyValues mpvs, ServletRequest request) {
        super.addBindValues(mpvs, request);
        for (PropertyValue propertyValue : mpvs.getPropertyValueList()) {
            if (propertyValue.getValue().equals(""))
                propertyValue.setConvertedValue(null);
        }
    }
}

注册器

话要从HandlerAdapter里系统自带的处理器说起。我这边系统默认带了24个处理器,其中有两个ServletModelAttributeMethodProcessor,也就是我们自定义处理器继承的系统处理器。SpringMVC处理请求参数是轮询每一个处理器,看是否支持,也就是supportsParameter方法, 如果返回true,就交给你出来,并不会问下面的处理器。这就导致了如果我们简单的把我们的自定义处理器加到HandlerAdapter的Resolver列中是不行的,需要加到第一个去。

public class EmptyStringToNullProcessorRegistry implements ApplicationContextAware, BeanFactoryPostProcessor {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

        RequestMappingHandlerAdapter requestMappingHandlerAdapter = applicationContext.getBean(RequestMappingHandlerAdapter.class);

        List<HandlerMethodArgumentResolver> resolvers = requestMappingHandlerAdapter.getArgumentResolvers();

        List<HandlerMethodArgumentResolver> newResolvers = new ArrayList<HandlerMethodArgumentResolver>();

        for (HandlerMethodArgumentResolver resolver : resolvers) {
            newResolvers.add(resolver);
        }
        EmptyStringToNullModelAttributeMethodProcessor processor = new EmptyStringToNullModelAttributeMethodProcessor(true);
        processor.setApplicationContext(applicationContext);
        newResolvers.add(0, processor);
        requestMappingHandlerAdapter.setArgumentResolvers(Collections.unmodifiableList(newResolvers));
    }
}

XML配置

    <mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean class="studio.geek.databind.EmptyStringToNullModelAttributeMethodProcessor">
                <constructor-arg name="annotationNotRequired" value="true"/>
            </bean>
        </mvc:argument-resolvers>
    </mvc:annotation-driven>

最后就可以完成将空字符串转为null

参考文档

  1. SpringMVC对象绑定时自定义名称对应关系
  2. SpringMVC源码分析和一些常用最佳实践

 

http://www.cnblogs.com/morethink/p/6435736.html

 

时间: 2024-10-30 02:29:43

SpringMVC空字符串转为null的相关文章

Oracle数据库中对null值的排序及mull与空字符串的区别_oracle

order by排序之null值处理方法在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题.在Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则排在最前.所以,为何分析数据的直观性方便性,我们需要对null的记录值进行相应处理. 这是四种oracle排序中NULL值处理的方法:1.使用nvl函数语法:Nvl(expr1, expr2)     若EXPR1是NULL,則返回

java-哪一种json工具能将空值转为空字符串?

问题描述 哪一种json工具能将空值转为空字符串? 像阿里的fastjson, fastjson等解析json的工具, 哪一种工具可以将数据库查询出来的空值转为 空字符串而不是转为null? 或者什么办法可以来 解决空值变为null的问题? 解决方案 可以重新json转换工具类的值映射方法,例如jackson 的用法. 参考:http://blog.csdn.net/Dracotianlong/article/details/29594107 解决方案二: http://blog.csdn.ne

MySQL中NULL与空字符串 空格问题

  一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串' '是相同的.这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的.NULL是指没有值,而''则表示值是存在的,只不过是个空值.. 这就相当于厂子给职工分房子,一共只有一套,老张和老李都想要,可是经理告诉老张,下次有您的房子,可是老李压根就没人搭理他.所以老张的房子是"空"的,因为这是空白支票,不过毕竟经理张口了,而老李的房子就是NULL的,因为根本就没有人考虑过他. 二者的区别不大,但是如果不仔细的话可

php setcookie时值为null或空字符串(删除cookie)

长久以来,在php中删除cookie的时候,都是使用 bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] ) $value 随便写, $expire设置为一个已经过去的时间即可. 官方文档中也是这样写的: http://www.php.n

为什么字符串转为字符串数组后长度会+1?且数组的第一个值为空?

问题描述 为什么字符串转为字符串数组后长度会+1?且数组的第一个值为空? 解决方案 解决方案二: String [] ss = s.split("");---->此处可以将字符串,一个一个拆分成打个字母,但是包含空格,如果不需要空格的话,自己写个法子 ,将空格删掉就行了! 解决方案三: 将一个字符串转化成数组可以用strcpy() 解决方案四: 去掉第一个的空就行

php setcookie值为null或空字符串删除cookie解析

官方文档中也是这样写的: #2 setcookie() delete example  代码如下 复制代码 <?php // set the expiration date to one hour ago setcookie ("TestCookie", "", time() - 3600); setcookie ("TestCookie", "", time() - 3600, "/~rasmus/"

MYsql中NULL与空字符串空区别详解

对于SQL的新手,NULL值的概念常常会造成混淆,他们常认为NULL与MySQL空字符串是相同的事.情况并非如此.例如,下述语句是完全不同的:MySQL> INSERT INTO my_table (phone) VALUES (NULL);  代码如下 复制代码 mysql> INSERT INTO my_table (phone) VALUES ('');   这两条语句均会将值插入phone(电话)列,但第1条语句插入的是NULL值,第2条语句插入的是空字符串.第1种情况的含义可被解释为

Access 2003 中 null 和 &#039;&#039; 空字符串的奇怪问题

最近系统运行中发现Access 2003 版本中对待 Null 和 '' (空字符)奇怪问题,重现步骤: 1.创建表tabTest : 2.使用设计视图添加两个字段 ID ,col1 名称 类型 长度 说明 ID Number     主键,自增 Col1 char 1 无             3.使用sql 添加如下数据 -- col1 字段设置为 null INSERT INTO tabtest (id, col1) VALUES(1, NULL); -- col1 字段设置为 '' I

Access 2003 中 null 和 &amp;#39;&amp;#39; 空字符串的奇怪问题

  国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.        ----------------------------------------------------------------------